检查UIViewController是否要从导航堆栈中popup?

我需要知道什么时候我的视图控制器即将从导航堆栈popup,所以我可以执行一个操作。

我不能使用-viewWillDisappear,因为当视图控制器被移出屏幕出于任何原因(比如新的视图控制器被推到顶部)时被调用。

我特别需要知道控制器什么时候会自动popup。

任何想法将是可怕的,在此先感谢。

我不认为有这个明确的消息,但你可以inheritanceUINavigationController并覆盖 – popViewControllerAnimated(虽然我还没有尝试过这之前我自己)。

或者,如果没有其他引用视图控制器,你可以添加到它的 – dealloc?

覆盖所呈现的VC中的viewWillDisappear方法,然后检查覆盖中的isMovingFromParentViewController标志并执行特定的逻辑。 在我的情况下,我隐藏导航控制器工具栏。 仍然要求你提出的风险投资理解,它被推动,虽然不完美。

幸运的是,在调用viewWillDisappear方法的时候,viewController已经从堆栈中移除了,所以我们知道viewController会popup,因为它不在self.navigationController.viewControllers

 - (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; if ((self.navigationController) && (![self.navigationController.viewControllers containsObject:self])) { NSLog(@"I've been popped!"); } } 

在您的UIViewController的自定义子类中尝试覆盖willMoveToParentViewController:而不是viewWillDisappear: willMoveToParentViewController:

在视图控制器被添加或从容器视图控制器中移除之前调用。

 - (void)willMoveToParentViewController:(UIViewController *)parent { [super willMoveToParentViewController:parent]; if (!parent) { // `self` is about to get popped. } } 

这是为我工作。

 - (void)viewDidDisappear:(BOOL)animated { if (self.parentViewController == nil) { NSLog(@"viewDidDisappear doesn't have parent so it's been popped"); //release stuff here } else { NSLog(@"PersonViewController view just hidden"); } } 

你可以在这里看到。

 - (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated { if (viewController == YourAboutToAppearController) { // do something } } 

这将在显示新视图之前触发。 没有人移动。 我使用所有的时间在asinine NavigationController前做魔术。 你可以设置标题和button标题,并做任何事情。

我也有同样的问题。 我试着用viewDisDisappear,但我没有函数得到调用:( :(不知道为什么,也许是因为我所有的VC是UITableViewController)。亚历克斯的build议工作正常,但它失败,如果您的导航控制器显示在更多选项卡在这种情况下,导航控制器的所有VC都将导航控制器作为UIMoreNavigationController,而不是您已经分类的导航控制器,所以当VC即将popup时不会通知导航。
最后,我解决了一个UINavigationController类的问题,只是重写 – (UIViewController *)popViewControllerAnimated:(BOOL)animated

 - (UIViewController *)popViewControllerAnimated:(BOOL)animated{ NSLog(@"UINavigationController(Magic)"); UIViewController *vc = self.topViewController; if ([vc respondsToSelector:@selector(viewControllerWillBePopped)]) { [vc performSelector:@selector(viewControllerWillBePopped)]; } NSArray *vcs = self.viewControllers; UIViewController *vcc = [vcs objectAtIndex:[vcs count] - 2]; [self popToViewController:vcc animated:YES]; return vcc;} 

这对我很好:D

我试过这个:

 - (void) viewWillDisappear:(BOOL)animated { // If we are disappearing because we were removed from navigation stack if (self.navigationController == nil) { // YOUR CODE HERE } [super viewWillDisappear:animated]; } 

这个想法是,在popup窗口,视图控制器的navigationController被设置为零。 所以如果视图消失了,而且它还有一个导航控制器,那么我的结论就是popup了。 (在其他情况下可能不起作用)。

不能担保这个viewWillDisappear将popup调用,因为它没有在文档中提到。 我试图当视图是顶视图,并在顶视图下 – 它在两个工作。

祝你好运,Oded。

你可以使用这个:

 if(self.isMovingToParentViewController) { NSLog(@"Pushed"); } else { NSLog(@"Popped"); } 

子类UINavigationController并重写popViewController

Swift 3

 protocol CanPreventPopProtocol { func shouldBePopped() -> Bool } class MyNavigationController: UINavigationController { override func popViewController(animated: Bool) -> UIViewController? { let viewController = self.topViewController if let canPreventPop = viewController as? CanPreventPopProtocol { if !canPreventPop.shouldBePopped() { return nil } } return super.popViewController(animated: animated) } //important to prevent UI thread from freezing // //if popViewController is called by gesture recognizer and prevented by returning nil //UI will freeze after calling super.popViewController //so that, in order to solve the problem we should not return nil from popViewController //we interrupt the call made by gesture recognizer to popViewController through //returning false on gestureRecognizerShouldBegin // //tested on iOS 9.3.2 not others func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool { let viewController = self.topViewController if let canPreventPop = viewController as? CanPreventPopProtocol { if !canPreventPop.shouldBePopped() { return false } } return true } } 

也许你可以使用UINavigationBarDelegate的navigationBar:shouldPopItem协议方法。

尝试使这个检查viewwilldisappear如果([self.navigationController.viewControllers indexOfObject:self] == NSNotFound){/ /突然这个视图发生。 }