#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. Назначьте его контроллеру навигации. Создайте подкласс контроллера навигации, добавьте делегата в подкласс и, наконец, выберите подкласс контроллера навигации в раскрывающемся списке для в инспекторе идентификации сцены навигации.