当视图控制器弹出或推入导航控制器堆栈时如何获得通知

Posted

技术标签:

【中文标题】当视图控制器弹出或推入导航控制器堆栈时如何获得通知【英文标题】:How to get notification when a view controller pop or push in to the navigation controller stack 【发布时间】:2014-08-21 01:14:51 【问题描述】:

我想在视图控制器弹出或推入导航控制器堆栈时收到通知。 我尝试使用

- (void)setViewControllers:(NSArray *)viewControllers

但我失败了。 而且我不想使用委托方法来实现这一点......

【问题讨论】:

什么对象或对象,你想收到这些通知吗? 【参考方案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 通知。

【讨论】:

我先用这种方式解决问题,- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated 还是谢谢大家。 代表nil 发布通知通常是一种不好的做法。在这种特殊情况下,您无法区分事件是否发生在您的导航 VC、另一个选项卡或模态选项卡中。经验法则是始终代表特定对象发布通知,并始终订阅代表特定对象发布的通知。【参考方案2】:

我使用 UINavigationControllerDelegate 方法来解决这个问题。

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

【讨论】:

是的,它很好用,谢谢。但我有一个架构问题:您将哪个对象分配为 navigationController.delegate?根视图控制器? 将其分配给导航控制器。将导航控制器子类化,将delegate添加到子类中,最后在导航场景的身份检查器的下拉菜单中选择子类化的导航控制器。

以上是关于当视图控制器弹出或推入导航控制器堆栈时如何获得通知的主要内容,如果未能解决你的问题,请参考以下文章

如何从导航堆栈中的任何位置弹出到任意视图控制器

将相同的视图控制器推入堆栈有奇怪的行为

当特定 ViewController 类被推入另一个选项卡中的堆栈时,如何从堆栈中弹出视图控制器?

iOS:如何检测视图控制器是不是在弹出或关闭后出现

弹出视图控制器离开堆栈而没有显示导航栏? [关闭]

Obj-C:从导航控制器中的 detailViewController 传回参数