假设我有一个带有 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(使用前将#替换为@)