Обновление данных в UIViewController после отклонения представленного им контроллера модального представления через делегата

У меня есть делегат, работающий с передачей данных с модального на контроллер представления. Но диспетчер представления представления не показывает данные, которые он получает от модального. Я просмотрел другие сообщения, и они говорят, что используют метод делегирования/протокола, но не объясняют, как/почему обновляющийся VC обновляется. Я предполагаю, что мой делегат настроен неправильно. В противном случае, каков метод обновления данных? Я проверил, и viewWillAppear и viewDidAppear не вызываются.

SCCustomerDetailVC.h(Представление VC)

#import "SCCustomersVC.h"

@interface SCCustomerDetailVC : UIViewController <SCCustomersVCDelegate>

@property (atomic, strong) SCCustomer *customer;
@property (strong, nonatomic) IBOutlet UIButton *changeCustomerButton;

- (IBAction)changeCustomerButtonPress:(UIButton *)sender;

@end

SCCustomerDetailVC.m(Представление VC)

- (IBAction)changeCustomerButtonPress:(UIButton *)sender 
{    
    UINavigationController *customersNC = [self.storyboard instantiateViewControllerWithIdentifier:@"customersNC"];
    SCCustomersVC *customersVC = (SCCustomersVC *)customersNC.topViewController;
    customersVC.delegate = self;
    [self presentViewController:customersNC animated:YES completion:nil];
}

//Protocol methods
- (void)passCustomer:(SCCustomer *)customer
{
    self.customer = customer;

    //At this point, self.customer has the correct reference

    [self dismissViewControllerAnimated:YES completion:nil];
}

SCCustomersVC.h(Modal VC)

#import "SCCustomersVCDelegate.h"

@class SCCustomerDetailVC;

@interface SCCustomersVC : UIViewController <UITableViewDelegate, UITableViewDataSource, UISearchBarDelegate>

@property (weak, nonatomic) id <SCCustomersVCDelegate> delegate;

@end

SCCustomersVC.m(Modal VC)

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    SCCustomer *customer = [self customerAtIndexPath:indexPath];
    [self.delegate passCustomer:customer];
}

SCCustomersVCDelegate.h

@class SCCustomer;

@protocol SCCustomersVCDelegate <NSObject>
@optional

- (void)passCustomer:(SCCustomer *)customer;

@end

Ответ 1

Я думаю, ты почти там. EDIT - просто узнал здесь, что поведение viewWillAppear отличается в iOS > 5. Вы по-прежнему хотите, чтобы представление отображалось для обновления вашего представления с помощью состояния модели, поскольку это необходимо сделать при первоначальной презентации.

И это нормально, чтобы называть его либо из вашего модального vc, либо из метода делегата. Поэтому добавьте код в viewWillAppear, который обновляет представление с помощью состояния модели контроллера представления...

// SCCustomerDetailVC.m
- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];

    // making up an IBOutlet called someLabel
    // making up a model method (description) that returns a string representing your model
    self.someLabel.text = [self.customer description];
}

Затем либо из представленного vc, либо из делегата вызовите viewViewWillAppear:

- (void)passCustomer:(SCCustomer *)customer
{
    self.customer = customer;
    [self viewWillAppear:YES];
    [self dismissViewControllerAnimated:YES completion:^{}];
}

Ответ 2

Вы должны перезагрузить свой пользовательский интерфейс после установки "клиент"

- (void)passCustomer:(SCCustomer *)customer
{
    self.customer = customer;

    //At this point, self.customer has the correct reference

    [self dismissViewControllerAnimated:YES completion:^{
            // reload your UI here or call a method which will reload your ui
            // e.g. for tableView it will be [tableView reload];
        }];
}