当前位置:  开发笔记 > IOS > 正文

检查UIViewController是否即将从导航堆栈中弹出?

如何解决《检查UIViewController是否即将从导航堆栈中弹出?》经验,为你挑选了6个好方法。

我需要知道我的视图控制器何时会从导航堆栈中弹出,以便我可以执行操作.

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

我特别需要知道控制器何时即将弹出.

任何想法都会很棒,提前谢谢.



1> Jeff Marino..:

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


来自Apple doc."......例如,一个视图控制器可以通过检查表达式([self isBeingDismissed] || [self isMovingFromParentViewController])来检查它是否已经消失,因为它在viewWillDisappear:方法中询问它是否已经消失.
这是iOS 5+中的一个干净的解决方案,此时谁不在iOS 5上?

2> ma11hew28..:

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

在视图控制器添加或从容器视图控制器中删除之前调用.

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



3> caoimghgin..:

幸运的是,在调用viewWillDisappear方法时,viewController已经从堆栈中删除了,所以我们知道viewController正在弹出,因为它不再出现在self.navigationController.viewControllers中了

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)

    if let nav = self.navigationController {
        let isPopping = !nav.viewControllers.contains(self)
        if isPopping {
            // popping off nav
        } else {
            // on nav, not popping off (pushing past, being presented over, etc.)
        }
    } else {
        // not on nav at all
    }
}



4> 小智..:

这对我有用.

- (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");
    }
}



5> Tom Elliott..:

我不认为有一个明确的消息,但你可以继承UINavigationController并覆盖 - popViewControllerAnimated(尽管我之前没有尝试过这个).

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


子类不会让你被苹果拒绝.类只是不用于子类化,因为apple使用的NSNavigaionController实例也无法访问,但是本质上存在子类化.
子类化'UINavigationController'将导致app被Apple拒绝.[文档】(http://developer.apple.com/library/ios/#documentation/uikit/reference/UINavigationController_Class/Reference/Reference.html)

6> dieselmcfadd..:

你可以在这里抓住它.

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated {

    if (viewController == YourAboutToAppearController) {
            // do something
    }
}

这将在显示新视图之前触发.没有人感动.我一直用asinine NavigationController做魔法.您可以设置标题和按钮标题,并在那里做任何事情.

推荐阅读
kikokikolove
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有