当视图控制器从导航控制器栈中弹出或推入时如何收到通知?

6

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

- (void)setViewControllers:(NSArray *)viewControllers

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

你希望接收这些通知的对象是什么? - rdelmar
2个回答

4
您可以子类化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];
}

我留下了用户信息像@ {},但如果您希望的话,可以放置一些内容,例如已添加或删除的控制器。
我不知道,但我认为您应该三思而后行,如果您的架构需要针对此类情况进行通知。
此外,您还需要检查是否有弹出方法彼此调用,在这种情况下,您可能会收到一个弹出的多个通知。

我最初使用这种方式来解决问题,- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated。还是非常感谢。 - Draven Zuo
代表 nil 发布通知通常是不好的做法。在这种情况下,您将无法区分事件是发生在导航 VC 中还是在另一个选项卡中,或者可能是在模态窗口中。经验法则是始终代表特定对象发布通知,并始终订阅代表特定对象发布的通知。 - kjam

4
我使用UINavigationControllerDelegate方法来解决这个问题。
- (void)navigationController:(UINavigationController *)navigationController
      willShowViewController:(UIViewController *)viewController
                    animated:(BOOL)animated

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接