iOS: как «обновить» UIViewController после добавления его дочернего UIViewController? - PullRequest
2 голосов
/ 02 августа 2011

В моем приложении я использую UINavigationController. У меня есть «родительский» UIViewController и «дочерний» UIViewController, работающий в стеке. Пользователь может выполнить некоторые настройки для дочернего элемента, которые позже предположительно повлияют на родительского элемента. Я использую NSUserDefaults для сохранения и извлечения данных, и, похоже, он работает нормально, согласно NSLog.

Что мне неясно, так это то, как я должен «обновлять» данные, когда я возвращаюсь от ребенка.

Позвольте мне быть более конкретным: у дочернего элемента есть кнопка «Назад», которая выполняет popViewControllerAnimated, а затем мы возвращаемся к родительскому элементу. Я хочу перезапустить весь метод, который у меня есть в viewDidLoad, чтобы поля родительского представления были установлены с изменениями, которые я получил из данных NSUserDefaults.

  1. Где в родительских методах я должен указывать представлению "обновить"?
  2. Как мне сделать это действие обновления? я должен снова вызвать viewDidLoad? Я читал о чем-то, что называется setNeedsDisplay, если это то, что я должен использовать, каков синтаксис (это «[self. View setNeedsDisplay]» или что-то еще)?

Может кто-нибудь направить и уточнить?

Ответы [ 3 ]

4 голосов
/ 02 августа 2011

Взгляните на NSNotification - это простой способ отправки обновлений из одной части вашего кода в другую, это встроенная система Apple NSNotification.

  1. Если у вас есть обновление, которое вы хотите отправить, вы звоните postNotificationName.Вы просто даете ему уникальную строку, которую составляете (например, « com.razeware.imagegrabber.imageupdated ») и объект (такой как ImageInfo, который только что завершил загрузку своего изображения).

  2. Если вы хотите узнать, когда произойдет это обновление, позвоните addObserver:selector:name:object.В нашем случае ImageListViewController захочет узнать, когда это произойдет, чтобы он мог перезагрузить соответствующую ячейку табличного представления.Хорошее место для этого - viewDidLoad.

  3. Не забудьте вызвать removeObserver:name:object, когда представление будет выгружено.В противном случае система уведомлений может попытаться вызвать метод в незагруженном представлении (или, что еще хуже, в нераспределенном объекте), что было бы плохо!через Рэя Вендерлиха блог

2 голосов
/ 02 августа 2011

Вы можете использовать NSUserDefaultsDidChangeNotification в качестве триггера для обновления контроллера корневого представления.

0 голосов
/ 08 декабря 2014

Вы также можете установить свой ViewController в качестве делегата NavigationViewController

self.navigationController.delegate = self;

Тогда вы будете получать вызовы делегатов в методе:

- (void)navigationController:(UINavigationController *)navigationController
       didShowViewController:(UIViewController *)viewController 
                    animated:(BOOL)animated {
    NSLog(@"Did Show controller %@", viewController);
    // Return from child
    if ([viewController isKindOfClass:[SRPeopleViewController class]]) {
        [self loadData];
    }

}

Небольшой недостаток- или стоимость этого решения заключается в том, что вы будете получать больше звонков, чем хотите, поэтому необходима фильтрация.

...