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 - 状态恢复 - 获取以前恢复的视图控制器的主要内容,如果未能解决你的问题,请参考以下文章

状态恢复iOS时播放声音

UIKit 状态保存不恢复滚动偏移

如何使用 iOS 状态恢复来恢复 UIPopoverController?

iOS 14 中的状态恢复

如何最好地处理核心数据+ iOS的状态恢复?

如果视图控制器由于内存警告而被卸载,如何恢复状态?