状态恢复时根视图控制器显示很短

Posted

技术标签:

【中文标题】状态恢复时根视图控制器显示很短【英文标题】:RootView Controller are shown shorty when state restorating 【发布时间】:2014-02-19 10:43:01 【问题描述】:

我使用 SDK 提供的状态恢复。

我从情节提要加载所有视图控制器。初始视图控制器以模态方式显示另一个视图控制器。两者都有一个恢复标识符。

恢复工作正常但是:当我在模态呈现的视图控制器中并按主页时(保存状态)。然后重新打开应用程序并开始状态恢复,发生以下情况:

一瞬间,我看到了初始视图控制器,然后屏幕变成了我真正想看到的模态呈现的控制器。

为什么会这样?缓存目录中的快照确实显示了正确的屏幕(来自呈现的视图控制器)。

您可以使用this project 重现该问题。在初始视图控制器的 viewDidAppear 方法中添加断点,当恢复状态时,您将在屏幕和视图层次结构中看到初始视图控制器的视图:

(lldb) po [[UIWindow keyWindow] recursiveDescription]
<UIWindow: 0x155607f0; frame = (0 0; 320 480); autoresize = W+H; gestureRecognizers = <NSArray: 0x15560d20>; layer = <UIWindowLayer: 0x1555f4f0>>
   | <UIView: 0x15542ad0; frame = (0 0; 320 480); autoresize = RM+BM; layer = <CALayer: 0x15542a70>>
   |    | <UIButton: 0x155432d0; frame = (137 269; 46 30); opaque = NO; autoresize = RM+BM; layer = <CALayer: 0x15543b30>>
   |    |    | <UIButtonLabel: 0x15663dd0; frame = (0 6; 46 18); text = 'Button'; clipsToBounds = YES; opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x1566da20>>
   |    | <_UILayoutGuide: 0x15542b60; frame = (0 0; 0 20); hidden = YES; layer = <CALayer: 0x15542fe0>>
   |    | <_UILayoutGuide: 0x15541060; frame = (0 480; 0 0); hidden = YES; layer = <CALayer: 0x155410d0>>

如果您检查视图控制器层次结构,模态呈现的视图控制器不在初始视图控制器呈现属性中:

(lldb) po [[[UIWindow keyWindow] rootViewController] presentedViewController]
 nil

并且断点在(理论上)状态恢复之后。但是以后会正确设置的。

【问题讨论】:

其实没有代码。只有应用程序委托方法返回是。其他一切都是隐含的。 【参考方案1】:

在使用情节提要时,您让框架为您调用 [window makeKeyAndVisible] 时似乎会发生该问题,并且在恢复后发生。

如果您在application:willFinishLaunchingWithOptions 中添加下一行:

[self.window makeKeyAndVisible];

它会修复它。

【讨论】:

这就是我遇到的问题。快速简单的修复。

以上是关于状态恢复时根视图控制器显示很短的主要内容,如果未能解决你的问题,请参考以下文章

硬盘显示操作无法完成,因为磁盘管理控制台视图不是最新状态要怎么寻回数据

如何使用状态恢复来恢复视图控制器的子视图

iOS - 状态恢复 - 获取以前恢复的视图控制器

UIKit 状态保存不恢复滚动偏移

如果视图控制器由于内存警告而被卸载,如何恢复状态?

如何使用 iOS 状态恢复来恢复 UIPopoverController?