Обновление данных в 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 (модальный 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
2 ответов
Я думаю, что вы почти там. EDIT-только что узнал здесь это поведение viewWillAppear отличается в iOS>5. Вы все равно хотите, чтобы view обновил ваше представление с состоянием модели, так как это необходимо сделать при первоначальной презентации.
и это нормально, чтобы вызвать его из вашего модального 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:^{}];
}
вы должны перезагрузить свой пользовательский интерфейс после установки "клиент"
- (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];
}];
}