我有一个导航控制器,里面有几个视图控制器。
在恢复application(_:viewControllerWithRestorationIdentifierPath:coder:)
每个控制器的应用程序方法调用时,最初是堆栈中的第一个,然后是第二个,依此类推。在恢复第二个视图控制器时,我需要参考第一个(在它们之间建立一些联系)。
有没有办法在此步骤中获取先前恢复的控制器,而无需将此控制器保存在应用程序的某个位置?(关于导航控制器也是如此,我不会在应用程序的任何地方保存对它的引用)
我有一个导航控制器,里面有几个视图控制器。
在恢复application(_:viewControllerWithRestorationIdentifierPath:coder:)
每个控制器的应用程序方法调用时,最初是堆栈中的第一个,然后是第二个,依此类推。在恢复第二个视图控制器时,我需要参考第一个(在它们之间建立一些联系)。
有没有办法在此步骤中获取先前恢复的控制器,而无需将此控制器保存在应用程序的某个位置?(关于导航控制器也是如此,我不会在应用程序的任何地方保存对它的引用)
在第一个视图控制器的encodeRestorableState
方法中编码第二个视图控制器。例如
第一视图控制器.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 中返回的内容。
我的理解是,只有在应用程序发送到后台之前查看的最后一个 View Controller 才会通过您上面列出的编码/解码方法使用 NSCoder 恢复其状态。但是您仍然需要保存自己的数据,例如使用 NSKeyedArchiver 或 Core Data 以防应用程序被用户终止或设备重新启动。在您的情况下,这可能是最好的解决方案。
请参阅此处的 encodeRestorableState 链接:
https://developer.apple.com/documentation/uikit/uiviewcontroller/1621461-encoderestorablestate
具体来说,它说:
此方法不能替代将应用程序的数据结构持久保存到磁盘。您应该继续使用现有技术将应用程序的实际数据保存到 iCloud 或本地文件系统。此方法仅用于保存配置状态或与您的应用程序用户界面相关的其他信息。您应该将写入编码器的任何数据视为可清除的,并准备好在后续启动期间不可用。