我的应用程序有一个简单的组织,我已在 Interface Builder Storyboard(而不是代码)中对其进行了配置。有一个导航 View Controller ,其 Root View Controller 设置为我的主视图 Controller 。我的主视图包含一个表格,其中单元格连接到详细 View Controller 。
当我在查看详细信息 View 时暂停应用程序然后恢复它时,我将返回到主视图,而不是详细信息 View 。为什么会这样?
详细信息:
我已经在 Interface Builder 中为导航 View Controller 、主视图 Controller 和详细 View Controller 设置了恢复 ID。我还尝试向 TableView 添加恢复 ID 并使主视图 Controller 实现 UIDataSourceModelAssociation。
我的应用程序从 shouldRestoreApplicationState 返回 YES,并且主视图和详细信息 View 都有编码/解码RestorableStateWithCoder 方法。
我正在使用模拟器测试挂起/恢复:我运行应用程序,导航到详细信息 View ,单击主页按钮,然后单击 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
除了恢复错误的 View 之外,还有一些奇怪的事情:为什么详细 View 的恢复标识符路径是“Navigation/DetailView”而不是“Navigation/MainView/DetailView”?导航 View Controller 和详细 View Controller 之间没有直接关系。它们在 Interface Builder 中的唯一连接是通过主视图中的 segue。
我是否配置错误?
我尝试将恢复等级分配给详细 View 。当调用该恢复代码时,它会失败,因为编码器中未设置 UIStateRestorationViewControllerStoryboardKey。
这是我的项目的一个玩具版本,它复制了该问题:https://github.com/WanderingStar/RestorationTest
我正在使用 XCode 版本 5.0 (5A1413) 和 iOS Simulator 版本 7.0 (463.9.4) 尝试此操作,以防相关。
最佳答案
答案很简单:我没有打电话
[super encodeRestorableStateWithCoder:coder];
在我的 View Controller 中的 encodeRestorableStateWithCoder:coder
方法中(并在解码中执行相同的操作...),这就是在编码器中设置 Storyboard 的内容。
本教程帮助我逐步完成该过程的每个步骤,并找出我出错的地方: http://useyourloaf.com/blog/2013/05/21/state-preservation-and-restoration.html
此外,事实证明“Navigation/DetailView”是预期的。导航 View Controller 恢复其堆栈中的所有 View ,然后将它们放回堆栈中,而不是每个 View 都恢复堆栈中后面的 View 。
关于ios - 为什么我的应用程序恢复后不返回到我的详细 View ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19218235/