Как автоматически вызвать метод после выталкивания контроллера представления из стека на iPhone - PullRequest
10 голосов
/ 16 июня 2009

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

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

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

Ответы [ 5 ]

13 голосов
/ 23 января 2012

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

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

Когда я создаю свое родительское представление (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
}

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

6 голосов
/ 16 июня 2009

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

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

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

3 голосов
/ 16 июня 2009

Я думаю, здесь есть некоторая путаница. UIView s не выталкиваются и не выталкиваются из стека 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, вам, вероятно, не о чем беспокоиться.)

2 голосов
/ 11 января 2013

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

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

- (void)viewWillAppear:(BOOL)animated
{
   [super viewWillAppear:animated];
    NSLog(@"View Appearing");
}
0 голосов
/ 17 июня 2009

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

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

...