如何判断我的ViewController何时再次成为堆栈顶部?

时间:2014-04-02 16:47:36

标签: ios ios7 uinavigationcontroller segue

当使用UINavigationController时,当用户是"潜水深入" (推动堆叠上的另一个控制器),我有机会在

中处理它
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender

但我如何处理相反的事情呢?当用户按下后退按钮,并且控制器再次成为顶级控制器时,我希望它可能更新某些状态,因为堆栈上的控制器可能已经改变了我想在现在可见的控制器中反映的一些内容。

或者,通过模拟,当我使用模态segue来呈现新的控制器时,我会选择一种方法,当呈现的控制器退出时,该方法被称为展开segue。如何使用导航堆栈管理控制器执行相同的操作?

(随意给这个更好的标题)

3 个答案:

答案 0 :(得分:5)

事实证明,您可以根据对isMovingToParentViewController的回复消除歧义。如果是YES,您的控制器刚刚放在堆栈的最顶层。如果它是NO,你的控制器将返回到最顶层,另一个推动它被弹出。例如:

-(void)viewWillAppear:(BOOL)animated{
    if (self.isMovingToParentViewController == NO) { // returning from even higher controller
        [self updateForChangesThatMayHaveHappenedInSubController];
    }
    [super viewWillAppear:animated];
}

答案 1 :(得分:1)

您可以使用viewWillAppear:方法在视图可见之前更新ui。如果要将数据传回链中,则应将自己指定为子项的委托,并在弹出之前调用委托上的更新函数。

答案 2 :(得分:0)

要让许多客户端(在这种情况下为viewControllers)更新其视图以响应某些共享数据的更改,您应该使用NSNotifications,或者您应该让viewControllers在共享数据对象(KVO)上观察某些值。 ViewController应该尽可能自闭,这意味着他们知道所有关于下游viewControllers的接口,但是完全不知道viewController是什么上游(回到上游viewController通常是通过委托来完成的,并且仅用于指示可能发生的事件)表示viewController层次结构中的某些更改,而不是共享数据状态。)

查看Paul Hegarty的斯坦福讲座,他解释得比我更好。