iOS: как обновить UIViewController после извлечения его дочернего UIViewController?

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

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

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

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

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


person Ohad Regev    schedule 02.08.2011    source источник


Ответы (3)


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

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

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

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

person d.lebedev    schedule 02.08.2011

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

person PeyloW    schedule 02.08.2011
comment
Это метод вроде - (void) NSUserDefaultsDidChangeNotification {} или какая-то строка, которую я должен где-то написать (и если да, то где)? - person Ohad Regev; 02.08.2011
comment
Нет, это имя уведомления, на которое вы можете зарегистрироваться, используя класс NSNotificationCenter. Вот коллекция документов по теме уведомлений: developer.apple .com/library/ios/documentation/Cocoa/Conceptual/ - person PeyloW; 02.08.2011

Вы также можете установить свой 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];
    }

}

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

person Tomek Cejner    schedule 08.12.2014