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

Posted

技术标签:

【中文标题】如何判断我的 ViewController 何时再次成为栈顶?【英文标题】:How to tell when my ViewController becomes top of stack again? 【发布时间】:2014-04-02 16:47:35 【问题描述】:

当使用UINavigationController 时,当用户“深入”时(将另一个控制器推入堆栈),我有机会处理该问题

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender

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

或者,以此类推,当我使用模态转场来呈现新控制器时,我会选择一种在呈现的控制器退出时称为展开转场的方法。如何对导航堆栈托管控制器执行相同操作?

(请随意给它一个更好的标题)

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

【参考方案2】:

您可以使用viewWillAppear: 方法在视图变得可见之前更新用户界面。如果您想将数据传回链上,您应该将自己指定为您的孩子的委托人,并在弹出之前在委托人上调用更新函数。

【讨论】:

是否可以区分 viewWillAppear: 是由于用户下降到堆栈的该级别还是上升到堆栈的该级别而发送的? 不明确。如果您想将数据传回堆栈,您应该使用委托来重新配置视图。但理想情况下,您的模型应该以允许视图正确配置自身以处理对弹出视图所做的更改的方式创建。 原来你可以根据isMovingToParentViewController的回复来消歧义。如果是YES,您的控制器刚刚被放置在堆栈的最顶端。如果它是NO,您的控制器将返回到最顶层,在它上面的另一个推送被弹出。 (您应该将此添加到您的答案中,以便我可以接受 )。【参考方案3】:

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

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

【讨论】:

我很感激。自 90 年代初以来,我一直在 Smalltalk 领域进行 MVC 和观察。所以我很欣赏你提出的观点。但这并没有真正回答我的问题......

以上是关于如何判断我的 ViewController 何时再次成为栈顶?的主要内容,如果未能解决你的问题,请参考以下文章

如何检测自定义表格视图单元格何时离开屏幕?

writeToFile 如何判断何时完成

iOS 和 Swift:ViewController 类已定义,但何时将其创建为对象?

如何判断片段在 N​​avigationDrawer 中何时不可见

我的 Outlet 何时与 IB 元素绑定?

OSX 如何判断用户何时插入/拔出带有内置麦克风的耳机