Как автоматически вызывать метод после того, как вы вытащили контроллер вида со стека на iPhone

Мне нужно обновить родительский вид на iPhone после появления дочернего представления из стека навигации. Как настроить родительское представление для уведомления или получения автоматического вызова метода, когда ребенок выскочил со стека, и родительский элемент снова станет видимым?

Пользователь вводит данные на дочерней странице, которые я хочу отобразить на родительской странице после того, как пользователь будет выполнен, и появится окно.

Спасибо за помощь!

Ответ 1

Я только решил эту проблему самостоятельно, и ответы выше почти правильны, они просто забыли о настройке делегата.

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

Когда я создаю родительское представление (SettingsView ниже) и добавлю его в качестве корневого представления UINavigationController, я обязательно установлю делегат UINavigationController перед отображением представления - что ключевая часть:

SettingsView *sv = [[SettingsView alloc] initWithNibName:@"SettingsView" bundle:nil];
UINavigationController *nc = [[UINavigationController alloc] initWithRootViewController:sv];
[nc setDelegate:sv];

В родительском представлении реализуйте протокол UINavigationControllerDelegate:

@interface SettingsView : UIViewController <UINavigationControllerDelegate>

и предоставить метод willShowViewController:

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
    // Your code to update the parent view
}

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

Ответ 2

Мне тоже нужно было сделать что-то подобное. В ViewController, которому принадлежал мой UINavigationController, мне пришлось реализовать willShowViewController, например:

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated {
}

Этот метод вызывается всякий раз, когда UINavigationController изменяет представления. Если я правильно понимаю ваш вопрос, я думаю, что это должно делать то, что вы хотите.

Ответ 3

Я думаю, здесь есть некоторая путаница. UIView не нажимаются и не выталкиваются из стека UINavigationController. То, что выталкивается и выталкивается, UIViewControllers, которые, в свою очередь, обрабатывают один или (чаще) несколько просмотров каждый.

К счастью, UIViewController имеет следующие методы:

-(void) viewWillAppear:(BOOL)animated;
-(void) viewDidAppear:(BOOL)animated;
-(void) viewWillDisappear:(BOOL)animated;
-(void) viewDidDisappear:(BOOL)animated;

Они вызывается всякий раз, когда появляется представление (dis) или появляется только (dis). Я работаю с вкладками, модальными представлениями и навигационными контроллерами. (И это хорошая идея, чтобы использовать их при реализации пользовательских контроллеров.)

Итак, в вашем случае, если я правильно понимаю, вам просто нужно переопределить метод viewWillAppear: или viewDidAppear: то, что вы называете "родительской страницей" (которое предположительно обрабатывается UIViewController) и введите код, чтобы обновить внешний вид страницы, чтобы отразить только что введенные данные.

(Если я правильно помню, вы должны убедиться, что UINavigationController получает сообщение viewWill/DidAppear:, когда оно впервые отображается, чтобы эти сообщения были отправлены позже на его дочерние контроллеры. Если вы установите это с помощью шаблон или в IB, вам, вероятно, не нужно беспокоиться об этом.)

Ответ 4

Ответ Felixyz помогло. При вызове представления появится метод, который будет запускать код в нем каждый раз, когда появится представление. В отличие от представления загружалась, которая запускает свой код только при первом загрузке представления. Таким образом, ваш родительский вид не будет обновляться, если дочерний вид изменил информацию, отображаемую в родительском элементе, а затем выскочил с мешка. Но если родительский вызов будет отображаться, код будет запускаться каждый раз, когда будет отображаться резервная копия.

Обязательно вызовите метод super одновременно. Правильная реализация будет выглядеть так:

- (void)viewWillAppear:(BOOL)animated
{
   [super viewWillAppear:animated];
    NSLog(@"View Appearing");
}

Ответ 5

Если вам нужно уведомить один контроллер другому, вы можете использовать шаблон делегирования, как описано здесь (см. 2-й ответ).

К сожалению, автоматическое уведомление (AFAIK) для точной задачи не описано. Чтобы удовлетворить ваши потребности, вы можете отправить сообщение делегату (т.е. Своему родительскому контроллеру) в функции viewWillDisappear вашего дочернего контроллера.