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

StackOverflow https://stackoverflow.com/questions/1001441

  •  05-07-2019
  •  | 
  •  

Вопрос

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

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

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

Это было полезно?

Решение

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

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

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

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

Другие советы

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

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top