我的应用程序有一个简单的组织,我在Interface Builder故事板(而不是代码中)中配置了该组织。有一个导航视图控制器,其根视图控制器设置为我的主视图控制器。我的主视图包含一个表格,其中单元格将转换为详细视图控制器。
当我在查看详细信息视图时暂停应用程序然后恢复它时,我将返回主视图,而不是详细信息视图。为什么会这样?
详细说明:
我在Interface Builder中为导航视图控制器,主视图控制器和详细视图控制器设置了恢复ID。我还尝试在表视图中添加一个Restoration ID,并使主视图控制器实现UIDataSourceModelAssociation。
我的应用程序从shouldRestoreApplicationState返回YES,主视图和详细信息视图都有encode / decodeRestorableStateWithCoder方法。
我正在使用模拟器测试暂停/恢复:我运行应用程序,导航到详细信息视图,点击主页按钮,然后单击XCode中的停止按钮。要恢复,我将再次从XCode运行该应用程序。
我在挂起时看到以下调用:
AppDelegate shouldSaveApplicationState
MainViewController encodeRestorableStateWithCoder
DetailViewController encodeRestorableStateWithCoder
简历:
AppDelegate shouldRestoreApplicationState
AppDelegate viewControllerWithRestorationIdentifierPath Navigation
AppDelegate viewControllerWithRestorationIdentifierPath Navigation/MainView
MainViewController viewDidLoad
AppDelegate viewControllerWithRestorationIdentifierPath Navigation/DetailView
MainViewController decodeRestorableStateWithCoder
除了正在恢复的错误视图之外,还有其他奇怪之处:为什么详细信息视图的“恢复标识符路径”为“Navigation / DetailView”而不是“Navigation / MainView / DetailView”?导航视图控制器和详细视图控制器之间没有直接关系。它们在Interface Builder中的唯一连接是通过主视图中的segue。
我错误配置了什么吗?
我已尝试将Restoration Class分配给Detail View。当调用该恢复代码时,它会失败,因为UIStateRestorationViewControllerStoryboardKey未在编码器中设置。
这是我的项目的玩具版本,它复制了问题:https://github.com/WanderingStar/RestorationTest
我正在尝试使用XCode版本5.0(5A1413)和iOS模拟器版本7.0(463.9.4),以防这些相关。
答案 0 :(得分:5)
答案很简单:我没有打电话
[super encodeRestorableStateWithCoder:coder];
在我的视图控制器中的encodeRestorableStateWithCoder:coder方法中(并在解码中做同样的事情......)。
本教程帮助我逐步完成了该过程的每个步骤,并找出出错的地方: http://useyourloaf.com/blog/2013/05/21/state-preservation-and-restoration.html
另外,事实证明“Navigation / DetailView”是预期的。导航视图控制器恢复其堆栈中的所有视图,然后将它们放回堆栈,而不是每个视图恢复堆栈中的后续视图。
答案 1 :(得分:0)
在iOS应用程序编程指南的“状态保存和恢复”部分,您可以方便地checklist进行恢复工作。
查看代码后,您似乎忘记了第3步,分配恢复类。您的类没有这些属性,并且您没有在应用程序委托中实现viewControllerWithRestorationIdentifierPath
。
将恢复类分配给相应的视图控制器。(如果不这样做,则会要求您的应用代理在恢复时提供相应的视图控制器。)请参阅“在以下位置恢复视图控制器”发布时间。“
答案 2 :(得分:0)
我看了看您的示例,发现applicationWillFinishLaunching缺少[self.window makeKeyAndVisible]
,这是状态还原的要求。这将使拆分控制器立即崩溃,然后将其正确还原。
存在一个问题,如果将其保存在横向(即分开的拆分视图)中,然后以纵向启动,则路径将不正确。在这种情况下,启动时它将首先折叠以匹配当前屏幕,然后开始还原并首先分离,然后还原完成后将再次折叠以匹配当前屏幕。在这段时间内,您需要实现viewControllerWithRestorationIdentifierPath并使用路径中的最后一个字符串来标识控制器,并在从最初在其中创建的情节提要中捕获的内容捕获完成后将其返回。然后,您可以在didFinish中清除这些属性。