iOS: как распознать, что мы вернулись из дочернего UIViewController в родительском UIViewController? - PullRequest
15 голосов
/ 02 августа 2011

Допустим, у меня есть 2 UIViewController в стеке внутри UINavigationController.В «родительском» мы вызываем «[self.navigationController pushViewController: childViewController animated: YES];»при некоторых действиях пользователя и в «потомке» мы вызываем «[self.navigationController popViewControllerAnimated: YES];»при некоторых действиях пользователя.

Как мы можем распознать в родительском объекте, что мы только что вернулись?

Есть ли какой-то управляемый "событием" метод, который может распознать, что это действие popViewControllerAnimated вызвано из дочернего

Ответы [ 4 ]

6 голосов
/ 02 августа 2011

Похоже, вы используете этот дочерний контроллер в качестве модального в том смысле, что его можно «отклонить».Если это так, попробуйте следовать шаблонам Apple, которые они используют для UIAlertViews.

Если это так, я бы сделал одно из следующих действий, чтобы реализовать шаблон делегата (делегат против блока является большой дискуссиейчто я не буду здесь вдаваться), поэтому владелец (тот, на кого подталкивает ребенка) знает, когда его уволят:

  • Создайте протокол (ChildControllerDelegate), используйте один метод childControllerWasDismissed: (ChildController*)
  • добавить свойство блока (убедитесь, что это свойство копии, а не сохранять) в ChildController

Затем вы захотите вызвать метод делегата или блок в viewDidDisappear.Если вы хотите более точный контроль зерна, используйте метод или блок делегата, который соответствует viewWillDisappear / viewDidDisappear.

4 голосов
/ 06 апреля 2016

Я успешно решил эту проблему, установив navigationController?.delegate = self и затем применив этот метод, чтобы определить, отображается ли текущий контроллер вида снова после всплывающего окна.

func navigationController(navigationController: UINavigationController, didShowViewController viewController: UIViewController, animated: Bool) {
        if viewController == self {
            // we got back
        } else {
            // some other controller was pushed
        }
    }
1 голос
/ 02 августа 2011

Есть несколько способов намекнуть на это. Что вы можете сделать, это вызвать popViewControllerAnimated от родителя. Вы можете сделать это, передав блок дочернему контроллеру, который затем выполнит указанный блок, и, таким образом, родительский контроллер выполнит извлечение.

Вы также можете использовать делегата UINavigationController, чтобы получать уведомления о прекращении работы UIViewController:

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

Этот метод позволит вам узнать, какой VC будет показан, и вы можете проверить, является ли текущий (еще не выданный) VC дочерним элементом, которого вы искали.

Вы также можете сделать некоторый трюк с - (void) viewWillAppear: но это может потребовать некоторых хаков.

0 голосов
/ 02 августа 2011

Сначала прочитайте это , это поможет вам понять, что происходит с контроллерами представления.

Затем внедрите viewWillAppear: и viewDidAppear: в родительском контроллере представления для регистрации сообщения.

...