嵌入Segue目标视图控制器被排除在UI状态恢复之外

时间:2013-12-29 20:01:07

标签: ios iphone objective-c segue state-restoration

我的应用使用嵌入segue一次在屏幕上显示多个视图控制器。我正在尝试实现UIKit状态恢复,但框架并不是要求我的嵌入式视图控制器对其状态进行编码和解码。这种情况会自动发生在所有其他类型的segue上。

UIKit状态恢复是否可以嵌入segues?

以下是演示此问题的示例应用程序:https://github.com/paulhimes/RestoreEmbeddedTest

2 个答案:

答案 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
}