10

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

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

#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 (Представление ВК)

- (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 (режимное ВК)

#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 
+0

Что вы делали после получения правильная ссылка в вашем делегате. – Zen

+0

@ Zen Yup, извините за беспокойство всех вас за это. По какой-то причине я подумал, что «волшебным образом» обновится вчера вечером в моем усталом состоянии. Мне нужно добавить код для его обновления. – guptron

ответ

6

Я думаю, вы почти там. EDIT - только что узнал here, что поведение 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]; 
} 

Тогда либо из представленных ВХ или делегата, вызовите viewViewWillAppear:

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

Спасибо, danh, я внес изменения и установил точку останова в viewWillAppear, но это не ударит. – guptron

+0

Я не знал о поведении в iOS. См. Мое редактирование. – danh

+0

Да, добавлен код метода делегата. Благодарю. – guptron

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]; 
     }]; 
} 
+0

Большое спасибо. Это работало как прелесть для меня. – Manthan

+0

Каким будет код для перезагрузки пользовательского интерфейса, который не использует вид таблицы, т. Е. Только текстовые метки? – user1904273

+0

Например: label.text = customer.name –

Смежные вопросы

 Смежные вопросы