1

我的故事板有: NavigationController -> UIViewController 1 -> UIViewController 2 -> UIViewController 3 -> UITabBarController -> 四个 UIViewControllers (a,b,c,d)

我正在为应用程序添加恢复支持。我已将其添加到 UIViewController #1 和 #3,现在将其添加到 UITabBarController 下的 UIViewController 'c'。

当我在显示 UIViewController 'c' 时使用 Xcode 杀死我的应用程序,然后再次启动应用程序时,正确调用了 viewcontroller 的方法并且其 UITextFields 的内容被正确恢复。

但是在“c”视图控制器中放置断点时,我可以看到 UIViewController 3 暂时显示。它的 viewDidLoad 和 viewWillAppear: 方法被调用。

显示 UIViewController #3 的典型原因是什么?

我一直在为我的 UIViewControllers 实施恢复,从最终用户的角度来看似乎没有任何负面影响 - 如果没有断点,显示器就没有机会更新以显示中间视图。

4

1 回答 1

2

这就是视图控制器恢复该应用程序从头开始启动;为了到达终止时显示的视图控制器,应用程序沿着链从根视图控制器到要显示给用户的视图控制器遍历视图控制器创建序列。它不可能以任何其他方式发生。(毕竟,如果 VC2 的后退按钮要通向 VC1,那么 VC2 必须在导航控制器堆栈中高于 VC1。)而且您不希望它发生,因为您可能有重要的工作要做,因为顺序是重建。通过在恢复过程中设置断点,您已经揭示了“幕后的人”。但是用户看不到那个过程(它被启动图像覆盖),所以有'

特别是viewDidLoad在创建链中以正确的顺序调用是非常重要的,并且在所有视图控制器被发送之前都会发生这种情况decodeRestorableStateWithCoder:,也是按照链的顺序进行的。

(但是,你不应该指望viewWillAppear:与它及其表亲有关的任何事情。这些可能会或可能不会被调用,而且你不能确定何时。我认为这种关于时间的不一致/不可预测性viewWillAppear:作为一个错误,但不幸的是,苹果没有。)

于 2014-03-19T16:28:07.693 回答