我的应用使用嵌入segue一次在屏幕上显示多个视图控制器。我正在尝试实现UIKit状态恢复,但框架并不是要求我的嵌入式视图控制器对其状态进行编码和解码。这种情况会自动发生在所有其他类型的segue上。
UIKit状态恢复是否可以嵌入segues?
以下是演示此问题的示例应用程序:https://github.com/paulhimes/RestoreEmbeddedTest
答案 0 :(得分:2)
根据您链接的项目,诀窍是从容器VC的编码实现中对嵌入式VC进行编码。
答案 1 :(得分:0)
您可以对prepareForSegue
捕获的embed-segue控制器属性进行编码,也可以仅对子元素进行编码,如下所示:
ContainerController.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
,则将使用情节提要(storyboard)不必要地实例化嵌入式控制器,这老实说很奇怪,考虑到返回nil
可能会阻止恢复沿那条路走,甚至发生。
EmbeddedController.m
- (void)encodeRestorableStateWithCoder:(NSCoder *)coder {
// super not called to prevent encoding storyboard
// or call super and then encode nil for UIStateRestorationViewControllerStoryboardKey
}