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

Posted

技术标签:

【中文标题】嵌入 Segue 目标视图控制器被排除在 UI 状态恢复之外【英文标题】:Embed Segue Destination View Controllers Are Excluded From UI State Restoration 【发布时间】:2013-12-29 20:01:07 【问题描述】:

我的应用使用 embed segues 在屏幕上同时显示多个视图控制器。我正在尝试实现 UIKit 状态恢复,但该框架并没有要求我的嵌入式视图控制器对它们的状态进行编码和解码。这会在所有其他类型的转场中自动发生。

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

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

【问题讨论】:

运气不好?我正在解决同样的问题。 查看链接的项目,你确实让它工作了。 【参考方案1】:

根据您链接到的项目,诀窍是从容器 VC 的编码实现中对嵌入式 VC 进行编码。

【讨论】:

【参考方案2】:

您可以对从 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];
    

在子控制器中,您必须实现 encode 并且不调用 super 或清除情节提要对象。原因是如果您决定实现viewControllerWithRestorationIdentifierPath 并在您不希望控制器出现时返回nil(例如,因为过时数据),那么嵌入式控制器将不必要地使用情节提要实例化,老实说是考虑到返回 nil 应该防止沿着这条路径进行恢复,这甚至会发生这种情况非常奇怪。

EmbeddedController.m

- (void)encodeRestorableStateWithCoder:(NSCoder *)coder 
    // super not called to prevent encoding storyboard
    // or call super and then encode nil for UIStateRestorationViewControllerStoryboardKey

【讨论】:

以上是关于嵌入 Segue 目标视图控制器被排除在 UI 状态恢复之外的主要内容,如果未能解决你的问题,请参考以下文章

prepareForSegue 未在嵌入式 segue 中调用

程序化嵌入 segue

iOS如何获取对带有segue的storyboard容器中嵌入的视图控制器的引用?

Swift:嵌入在导航控制器中的视图之间的自定义segue

在 Xcode7 - beta 5 和 storyboard 中展开 segue

模态segue推动顶部的附加导航栏滑动