我的应用程序使用嵌入 segues 来一次在屏幕上显示多个视图控制器。我正在尝试实现 UIKit 状态恢复,但该框架并没有要求我的嵌入式视图控制器对它们的状态进行编码和解码。这会自动发生在所有其他类型的 segue 中。
UIKit 状态是否可以通过嵌入 segues 恢复?
这是一个演示此问题的示例应用程序:https ://github.com/paulhimes/RestoreEmbeddedTest
我的应用程序使用嵌入 segues 来一次在屏幕上显示多个视图控制器。我正在尝试实现 UIKit 状态恢复,但该框架并没有要求我的嵌入式视图控制器对它们的状态进行编码和解码。这会自动发生在所有其他类型的 segue 中。
UIKit 状态是否可以通过嵌入 segues 恢复?
这是一个演示此问题的示例应用程序:https ://github.com/paulhimes/RestoreEmbeddedTest
根据您链接到的项目,诀窍是从容器 VC 的编码实现中对嵌入式 VC 进行编码。
您可以对从子级捕获的 embed-segue 控制器属性进行编码,也可以对子级prepareForSegue
进行编码,如下所示:
容器控制器.m
- (void)encodeRestorableStateWithCoder:(NSCoder *)coder {
[super encodeRestorableStateWithCoder:coder];
for(UIViewController *cvc in self.childViewControllers){
if(!cvc.restorationIdentifier){
continue;
}
[coder encodeObject:cvc forKey:cvc.restorationIdentifier];
}
}
在子控制器中,您必须实现编码并且不调用 super 或清除情节提要对象。原因是如果您决定实现viewControllerWithRestorationIdentifierPath
并nil
在您不希望控制器出现时返回(例如,因为过时的数据),嵌入式控制器将被不必要地使用情节提要实例化,老实说,即使发生这种情况也很奇怪回归nil
应该是为了防止恢复沿着这条路走下去。
嵌入式控制器.m
- (void)encodeRestorableStateWithCoder:(NSCoder *)coder {
// super not called to prevent encoding storyboard
// or call super and then encode nil for UIStateRestorationViewControllerStoryboardKey
}