为什么我的应用程序在还原时不能返回到我的详细信息视图?

我的应用程序有一个简单的组织,我已经在界面生成器故事板(不是在代码中)configuration。 有一个导航视图控制器,其根视图控制器设置为我的主视图控制器。 我的主视图包含一个表格,其中单元格继续到Detail View Controller。

当我在查看详细视图的同时暂停应用程序,然后恢复它时,我返回到主视图,而不是详细视图。 为什么会这样?

细节:

我在界面生成器中为导航视图控制器,主视图控制器和细节视图控制器设置了恢复ID。 我也尝试添加一个恢复ID到表视图,并使主视图控制器实现UIDataSourceModelAssociation。

我的应用程序从shouldRestoreApplicationState返回YES,Main View和Detail View都有encode / decodeRestorableStateWithCoder方法。

我使用模拟器testing暂停/恢复:我运行应用程序,导航到详细信息视图,点击主页button,然后单击XCode中的停止button。 恢复,我从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”的恢复标识符path而不是“Navigation / MainView / DetailView”? 导航视图控制器和详细视图控制器之间没有直接的关系。 它们在Interface Builder中的唯一连接是通过主视图中的segue。

我有错误的configuration吗?

我曾尝试将恢复类分配给详细视图。 当该恢复代码被调用时,由于未在编码器中设置UIStateRestorationViewControllerStoryboardKey而失败。

这是我的项目的一个玩具版本,它复制了这个问题: https : //github.com/WanderingStar/RestorationTest

我试图用XCode版本5.0(5A1413)和iOS模拟器版本7.0(463.9.4),以防这些相关。

答案很简单:我没有打电话

 [super encodeRestorableStateWithCoder:coder]; 

在我的视图控制器encodeRestorableStateWithCoder:编码器方法(并做相同的解码…)。

本教程帮助我逐步了解该过程的每个步骤,并找出我出错的地方: http : //useyourloaf.com/blog/2013/05/21/state-preservation-and-restoration.html

此外,事实certificate,“导航/ DetailView”是预期的。 导航视图控制器恢复其堆栈中的所有视图,然后将它们放回到堆栈中,而不是每个视图在堆栈中恢复后面的视图。

在“iOS应用程序编程指南”中的“状态保存和恢复”部分,有一个方便的清单 ,说明如何进行恢复工作。

看完你的代码后,你似乎忘了第3步,分配恢复类。 您的类没有这些属性,并且您没有在应用程序委托中实现viewControllerWithRestorationIdentifierPath

将恢复类别分配给相应的视图控制器。 (如果不这样做,应用程序委托会在恢复时提供相应的视图控制器。)请参见“在启动时恢复视图控制器”。