如何在UINavigationController中获得弹出视图的通知?

时间:2011-03-09 13:57:14

标签: delegates uinavigationcontroller pop

我希望当用户在到达某个UINavigationController时按下UIViewController上的后退按钮时执行操作。

不幸的是,UINavigationControllerDelegate似乎没有任何方法可以获得有关视图弹出的通知。

作为一种解决方法,我现在在viewDidDisappear方法中执行了我的操作,只有在animatedYES时才会触发。这有效,但有点难看。

我该如何正确地做到这一点?

5 个答案:

答案 0 :(得分:19)

从导航视图控制器(以及模态)处理pop的最常用方法是为视图控制器实现viewWillDisappear

- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];

    if (self.isMovingFromParentViewController || self.isBeingDismissed) {
        // This view controller is being popped or dismissed
    }
}

答案 1 :(得分:4)

如果您在堆栈中有一个对控制器的引用,那么当弹出这个控件时会显示该控制器,您可以注册为委托并通过

进行检查
navigationController:willShowViewController:animated:

答案 2 :(得分:0)

您可以在viewWillDisappear时调用委托方法,也可以在viewWillAppear上为某些UIViewController设置逻辑。

答案 3 :(得分:0)

您可以观察UINavigationControllerDelegate并检查是否会发生转换:

- (void)navigationController:(UINavigationController *)navigationController
          willShowViewController:(UIViewController *)viewController
                        animated:(BOOL)animated
    {
        if([navigationController.viewControllers containsObject:self])
        {
            NSLog(@"push");
        }
        else
        {
            NSLog(@"pop");
        }
    }

答案 4 :(得分:0)

首先你需要让 UINavigationControllerDelegate 符合导航控制器并实现这个方法

 public func navigationController(
    _ navigationController: UINavigationController,
    didShow viewController: UIViewController,
    animated: Bool) {
    guard let dismissedViewController =
            navigationController.transitionCoordinator?
            .viewController(forKey: .from),
          !navigationController.viewControllers
            .contains(dismissedViewController) else {
        return
    }
    performOnDismissed(for: dismissedViewController)
}

在 performOnDismissed 函数中,您可以检查dismissedViewController,如

if (dismissedViewController is DesireViewController)

然后,触发你的方法。