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

11

当用户在我的UINavigationController到达特定的UIViewController时按下返回按钮,我想执行一个操作。

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

作为解决方法,我现在在viewDidDisappear方法中执行我的操作,只有在animatedYES时才会触发。 这个方法可行,但有点丑陋。

应该如何正确实现这一功能?


如果您想要先知道,请在操作中使用viewWillDisappear。 - Vijay-Apple-Dev.blogspot.com
5个回答

31

处理来自导航视图控制器(以及模态窗口)的弹出最流行的方法是为您的视图控制器实现viewWillDisappear

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

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

5
如果您拥有控制器堆栈中下级的引用,当此控制器弹出时将显示该控制器,您可以注册为委托并通过检查其进行验证。
navigationController:willShowViewController:animated:

0
你可以观察UINavigationControllerDelegate并检查转换是否会发生:
- (void)navigationController:(UINavigationController *)navigationController
          willShowViewController:(UIViewController *)viewController
                        animated:(BOOL)animated
    {
        if([navigationController.viewControllers containsObject:self])
        {
            NSLog(@"push");
        }
        else
        {
            NSLog(@"pop");
        }
    }

1
如果您有一个UITabBarController,应该使用此解决方案,因为每次更改当前选项卡索引时都会调用viewWillDisappear。 - FouZ

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)

然后,调用你的方法。


0

你可以在 viewWillDisappear 时调用代理方法,或者在某些 UIViewController 的 viewWillAppear 上设置逻辑。


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