iOS - 状态恢复 - 获取以前恢复的视图控制器
Posted
技术标签:
【中文标题】iOS - 状态恢复 - 获取以前恢复的视图控制器【英文标题】:iOS - State restoration - Get previously restored view controller 【发布时间】:2017-05-22 19:42:13 【问题描述】:我有一个导航控制器,里面有几个视图控制器。
在恢复应用程序时,application(_:viewControllerWithRestorationIdentifierPath:coder:)
方法会一个一个地调用每个控制器,最初是堆栈中的第一个,然后是第二个,依此类推。
在恢复第二个视图控制器时,我需要参考第一个(在它们之间建立一些联系)。
有什么方法可以在此步骤中获取先前恢复的控制器,而无需将此控制器保存在应用程序的某个位置? (导航控制器也是如此,我不会在应用程序的任何地方保存对它的引用)
【问题讨论】:
【参考方案1】:我的理解是,只有在应用程序发送到后台之前查看的最后一个 View Controller 才会通过您上面列出的编码/解码方法使用 NSCoder 恢复其状态。 但是您仍然需要保存自己的数据,例如在应用程序被用户终止或设备重启的情况下使用 NSKeyedArchiver 或 Core Data。这可能是您的最佳解决方案。
请在此处查看 encodeRestorableState 的链接:
https://developer.apple.com/documentation/uikit/uiviewcontroller/1621461-encoderestorablestate
具体来说:
此方法不能替代保存您应用的数据 结构持久保存到磁盘。你应该继续保存你的 应用程序的实际数据到 iCloud 或使用现有的本地文件系统 技巧。此方法仅用于保存配置 与您应用的用户界面相关的状态或其他信息。你 应该将您写入编码器的任何数据视为可清除的并且是 准备好在后续发布期间不可用。
【讨论】:
【参考方案2】:在第一个视图控制器的encodeRestorableState
方法中编码第二个视图控制器。例如
FirstViewController.m
- (void)prepareForSegue:(UIStoryboardSegue *)segue
// configure and store it...
// self.secondViewController = controller;
- (void)encodeRestorableStateWithCoder:(NSCoder *)coder
[super encodeRestorableStateWithCoder:coder];
if (self.secondViewController)
[coder encodeObject:self.secondViewController forKey:kSecondViewControllerKey];
- (void)decodeRestorableStateWithCoder:(NSCoder *)coder
[super decodeRestorableStateWithCoder:coder];
self.secondViewController = [coder decodeObjectForKey:kSecondViewControllerKey];
- (void)applicationFinishedRestoringState
// self.secondViewController's properties are now also decoded and ready to be used
application:viewControllerWithRestorationIdentifierPath:
可以为第二个视图控制器返回 nil,它将为您从情节提要中返回一个,参考将是 decodeObjectForKey 中返回的内容。
【讨论】:
以上是关于iOS - 状态恢复 - 获取以前恢复的视图控制器的主要内容,如果未能解决你的问题,请参考以下文章