Как получать уведомления, когда контроллер представления всплывает или вставляется в стек контроллера навигации

#ios #uinavigationcontroller #navigation #stack

#iOS #uinavigationcontroller #навигация #стек

Вопрос:

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

 - (void)setViewControllers:(NSArray *)viewControllers
  

Но мне не удалось.
И я не хочу использовать метод делегирования для достижения этой цели…

Комментарии:

1. Какой объект или объекты вы хотите получать эти уведомления?

Ответ №1:

Вы можете подкласс UINavigationController и переопределить некоторые методы:

 - (NSArray *)popToRootViewControllerAnimated:(BOOL)animated {
    [[NSNotificationCenter defaultCenter] postNotificationName:@"poped" object:nil userInfo:@{}];
    return [super popToRootViewControllerAnimated:animated];
}

- (NSArray *)popToViewController:(UIViewController *)viewController animated:(BOOL)animated {
    [[NSNotificationCenter defaultCenter] postNotificationName:@"poped" object:nil userInfo:@{}];
    return [super popToViewController:viewController animated:animated];
}

- (UIViewController *)popViewControllerAnimated:(BOOL)animated {
    [[NSNotificationCenter defaultCenter] postNotificationName:@"poped" object:nil userInfo:@{}];
    return [super popViewControllerAnimated:animated];
}

- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated {
    [[NSNotificationCenter defaultCenter] postNotificationName:@"pushed" object:nil userInfo:@{}];
    return [super pushViewController:viewController animated:animated];
}
  

я оставил информацию о пользователе как @{}, но вы можете поместить туда что-нибудь, если хотите, например, контроллер, который был добавлен или удален.

Я не знаю, но я думаю, вам следует дважды подумать, если вам нужны уведомления для такой ситуации.

Также вы должны проверить, вызывают ли методы pop друг друга, в такой ситуации вы можете получить несколько уведомлений для одного pop.

Комментарии:

1. Сначала я использую этот способ для решения проблемы, — (void)NavigationController:(UINavigationController *)NavigationController willShowViewController:(UIViewController *)ViewController анимированный:(BOOL) анимированный Все равно Спасибо.

2. Отправка уведомления от имени nil в целом является плохой практикой. В этом конкретном случае вы не сможете определить, произошло ли событие в вашем навигационном VC, или на другой вкладке, или, может быть, в модальном. Эмпирическое правило заключается в том, чтобы всегда публиковать уведомления от имени определенного объекта и всегда подписываться на уведомления, размещенные от имени определенного объекта.

Ответ №2:

Я использую метод UINavigationControllerDelegate для решения этой проблемы.

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

Комментарии:

1. Да, это работает хорошо, спасибо. Но у меня есть вопрос по архитектуре: какой объект вы назначаете в качестве NavigationController.delegate? Корневой контроллер представления?

2. Назначьте его контроллеру навигации. Создайте подкласс контроллера навигации, добавьте делегата в подкласс и, наконец, выберите подкласс контроллера навигации в раскрывающемся списке для в инспекторе идентификации сцены навигации.