我希望当用户在到达某个UINavigationController
时按下UIViewController
上的后退按钮时执行操作。
不幸的是,UINavigationControllerDelegate
似乎没有任何方法可以获得有关视图弹出的通知。
作为一种解决方法,我现在在viewDidDisappear
方法中执行了我的操作,只有在animated
为YES
时才会触发。这有效,但有点难看。
我该如何正确地做到这一点?
答案 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)
然后,触发你的方法。