【问题标题】:The callback sequence of viewDidAppear and viewDidDisappear between two view controllers两个视图控制器之间viewDidAppear和viewDidDisappear的回调序列
【发布时间】:2011-07-01 19:20:40
【问题描述】:

据我所知,至少有两种方法可以在另一个 UIViewController 上呈现 UIViewController,第一种是在 UIViewController 上使用 presentModalViewController:animated:,另一种是在 UINavigationController 上使用 pushViewController:animated:,似乎当 2 个视图控制器改变它们的外观时,出现/消失回调的调用顺序不同。下面是一个例子,A是一个UINavigationController,B是一个普通的视图控制器,实际的回调顺序是:
(1) A 使用 presentModalViewController:animated: 来展示 B:

[B viewWillAppear];  
[A viewWillDisappear];  
[B viewDidAppear];  
[A viewDidDisappear];

(2) A 使用 pushViewController:animated: 显示 B:

[A viewWillDisappear];  
[B viewWillAppear];  
[A viewDidDisappear];  
[B viewDidAppear];

所以我的问题是,这些不同的回调序列是稳定的,还是没有我们可以依赖的明确序列?如果它们是稳定的,是否有任何文件提到这种行为?

【问题讨论】:

    标签: iphone ipad uiviewcontroller


    【解决方案1】:

    UIKit应该在主线程上工作,所以我猜这个序列是稳定的,对于当前的SDK版本。但是,只要行为没有被记录在案(据我所知),我会认为它可能会发生更改,恕不另行通知。

    我只是好奇;为什么你需要这些方法的确定序列?也许您可以找到一种解决方法(这可能是一种更好的方法)。

    【讨论】:

    • 有一个标志表示状态变化,这个标志会在viewDidDisappear方法中更新。如果这个回调序列依赖于 Apple 的内部实现但没有记录在案,并且可能在未知的未来发生变化,我认为我的设计应该改进。谢谢!
    • 我需要一个确定的序列,因为我的四个选项卡控制的视图控制器中有两个使用共享加速度计。两者都需要设置共享委托属性来获取加速数据并在消失时移除委托(nil)。我为此使用了 viewWillAppear (set) 和 viewWillDisappear (nil),但有时在出现的 VC 将委托设置为自身后,消失​​的 VC 会将委托归零。我的解决方案:在 viewWillDisappear 中设置代理并在 viewDidAppear 中设置代理。消失的 VC 的 viewWillDisappear 总是发生在出现的 VC 的 viewDidAppear 之前。
    • @Jeff 也许你有充分的理由这样做,但我会考虑不同的实现。就像下面提到的futureelite7 一样,当您遇到同步问题时,您将希望拥有自己的控制权,而不是依赖Apple 的调用序列,即使调用序列看起来显然不会改变(就像您的情况一样)。例如,谁知道 UIKit 最终会在由图形硬件仲裁的多核 CPU 上进行多线程处理,所以离开视图的 viewWillDisappear 和传入视图的 viewDidAppear 之间可能存在竞争条件?
    • @Jeff 虽然这个具体的例子看起来不太可能,但它告诉我们最好的通用方法是通过同步代码强制事件的确定性顺序。
    【解决方案2】:

    您肯定希望实现某种形式的同步来强制执行您想做的事情。依赖苹果对这些函数的调用顺序就是自找麻烦。

    【讨论】:

    • 是的,你是对的,我不应该依赖苹果的内部行为。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-23
    • 1970-01-01
    • 1970-01-01
    • 2011-12-29
    • 1970-01-01
    相关资源
    最近更新 更多