iOS 如何以编程方式检测顶视图控制器何时弹出?

2024-03-21

假设我有一个带有 2 个视图控制器的导航控制器堆栈:VC2 位于顶部,VC1 位于底部。我可以在 VC1 中包含一些代码来检测 VC2 刚刚从堆栈中弹出吗?

由于我试图从 VC1 的代码中检测 VC2 的弹出,似乎类似视图将出现 or 查看是否出现不起作用,因为每次显示 VC1 时这些方法都会触发,包括第一次将其压入堆栈时。

EDIT:看来我对原来的问题不是很清楚。这就是我想要做的:确定由于 VC2 从堆栈顶部弹出而何时显示 VC1。这就是我不想做的事情:确定 VC1 由于被推到堆栈顶部而显示的时间。我需要某种方法来检测第一个操作,但不能检测第二个操作。

注意:我并不特别关心 VC2,它可以是任意数量的其他 VC 从堆栈中弹出,我真正关心的是当 VC1 由于其他一些 VC 开始从堆栈中弹出而再次成为堆栈顶部时顶部。


iOS 5 引入了两种新方法来处理这种情况。您正在寻找的是-[UIViewController isMovingToParentViewController]。来自docs http://developer.apple.com/library/ios/#documentation/uikit/reference/UIViewController_Class/Reference/Reference.html:

isMovingToParentViewController

返回一个布尔值,表示 视图控制器正在添加到父级。

- (BOOL)isMovingToParentViewController

返回值
如果视图控制器因为被添加为容器的子级而出现,则为 YES 查看控制器,否则NO。

讨论
仅当从内部调用此方法时才返回 YES 以下方法:

-viewWillAppear:
-viewDidAppear:

在你的情况下你可以实施-viewWillAppear:像这样:

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

    if (self.isMovingToParentViewController == NO)
    {
        // we're already on the navigation stack
        // another controller must have been popped off
    }
}

EDIT:这里需要考虑一个微妙的语义差异 - 您是否对 VC2 特别从堆栈中弹出这一事实感兴趣,或者您是否希望每次由于以下原因而显示 VC1 时收到通知any控制器弹出?对于前一种情况,委派是更好的解决方案。如果您从不打算重用 VC2,那么对 VC1 的直接弱引用也可以起作用。

EDIT 2:我通过反转逻辑并且不提前返回来使示例更加明确。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

iOS 如何以编程方式检测顶视图控制器何时弹出? 的相关文章

随机推荐