iOS - 状态恢复 - 获取以前恢复的视图控制器

时间:2017-05-22 19:42:14

标签: ios state-restoration

我有一个导航控制器,里面有几个视图控制器。

同时为每个控制器逐个恢复app application(_:viewControllerWithRestorationIdentifierPath:coder:)方法调用,最初为堆栈中的第一个,然后是第二个,依此类推。 在恢复第二个视图控制器时,我需要引用第一个视图控制器(在它们之间建立连接)。

有没有办法在此步骤中获取以前恢复的控制器而不将此控制器保存在应用程序的某个位置? (同样是关于导航控制器我不会在应用程序的任何地方保存指示对象)

2 个答案:

答案 0 :(得分:0)

我的理解是,只有在将应用程序发送到后台之前查看的最后一个View Controller才会通过上面列出的编码/解码方法(使用NSCoder)恢复其状态。 但您仍需要保存自己的数据,例如使用NSKeyedArchiver或Core Data以防用户终止应用程序,或者设备重新启动。在您的情况下,这可能是最佳解决方案。

请在此处查看encodeRestorableState的链接:

https://developer.apple.com/documentation/uikit/uiviewcontroller/1621461-encoderestorablestate

具体说:

  

此方法不能替代保存应用的数据   结构持久到磁盘。你应该继续保存你的   应用程序的实际数据使用现有的iCloud或本地文件系统   技术。此方法仅用于保存配置   与您的应用程序的用户界面相关的状态或其他信息。您   应该将您写入编码器的任何数据视为可清除的数据   准备在随后的发布期间无法使用。

答案 1 :(得分:0)

以第一个视图控制器的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返回的。