2

我的应用程序有一个简单的组织,我已在 Interface Builder 故事板中配置(不是在代码中)。有一个导航视图控制器,它的根视图控制器设置为我的主视图控制器。我的主视图包含一个表格,其中单元格连接到详细视图控制器。

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

细节:

我在界面生成器中为导航视图控制器、主视图控制器和详细视图控制器设置了恢复 ID。我还尝试将恢复 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”?Navigation View Controller 和 Detail View Controller 之间没有直接关系。它们在 Interface Builder 中的唯一连接是通过 Main View 中的 segue。

我是否配置错误?

我尝试将恢复类分配给详细信息视图。调用该恢复代码时,它会失败,因为未在编码器中设置 UIStateRestorationViewControllerStoryboardKey。

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

我正在尝试使用 XCode 版本 5.0 (5A1413) 和 iOS 模拟器版本 7.0 (463.9.4),以防万一。

4

3 回答 3

5

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

[super encodeRestorableStateWithCoder:coder];

在我的视图控制器中的encodeRestorableStateWithCoder:coder方法中(并在解码中做同样的事情......),这就是在编码器中设置故事板的原因。

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

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

于 2013-10-08T04:30:01.087 回答
0

在 iOS App Programming Guide 的“State Preservation and Restoration”部分中,有一个方便的清单,说明您必须做什么才能使恢复工作。

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

将恢复类分配给适当的视图控制器。(如果您不这样做,您的应用程序代理会被要求在恢复时提供相应的视图控制器。)请参阅“在启动时恢复您的视图控制器”。</p>

于 2013-10-07T07:37:03.593 回答
0

我查看了您的示例,并且缺少 applicationWillFinishLaunching[self.window makeKeyAndVisible]这是状态恢复的要求。这将使拆分控制器立即崩溃,然后它将正确恢复。

存在一个问题,如果它被保存在横向,即分离的拆分视图,然后以纵向启动,那么路径将不正确。在这种情况下,在启动时它将首先折叠以匹配当前屏幕,然后它开始恢复并首先分离,然后在恢复完成后它将再次折叠以匹配当前屏幕。在此期间,您需要实现 viewControllerWithRestorationIdentifierPath 并使用路径中的最后一个字符串来识别控制器,并在从最初创建的情节提要完成启动的内容中捕获它后返回它。然后你可以在 didFinish 中清除这些属性。

于 2019-06-08T17:00:29.410 回答