Мне нужно обновить родительский вид на 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 вашего дочернего контроллера.