IOS: Как распознать, что мы вернулись из дочернего UIViewController в родительском UIViewController?

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

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

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

Ответы

Ответ 1

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

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

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

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

Ответ 2

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

func navigationController(navigationController: UINavigationController, didShowViewController viewController: UIViewController, animated: Bool) {
        if viewController == self {
            // we got back
        } else {
            // some other controller was pushed
        }
    }

Ответ 3

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

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

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

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

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

Ответ 4

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

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