繁体   English   中英

iOS 8中的UISplitViewController状态恢复

[英]UISplitViewController state restoration in iOS 8

在iOS 8上,UISplitViewController似乎可以保存和恢复其子视图的状态,例如,是否隐藏主视图。

这是不可取的,因为我的应用程序应始终在横向显示主视图并始终以纵向隐藏它。 如果用户以横向关闭应用程序(保存横向状态)并以纵向重新打开(横向状态已恢复),则UISplitViewController将以错误的配置显示主视图。

我仍然需要为UISplitViewController提供恢复标识符,以便子视图控制器保存和恢复自己的状态。 那么如何防止UISplitViewController恢复自己的状态,或者覆盖这种行为呢?

我通过继承UISplitViewController并重写- (void)decodeRestorableStateWithCoder:(NSCoder *)coder来解决这个问题。 这样,拆分视图控制器没有机会恢复其视图,但其子视图控制器仍然参与状态恢复。

实现UI状态恢复时所需的第一件事就是从使用didFinishLaunchingWithOptions变为willFinishLaunchingWithOptions。 如果您现在在willFinish中设置委托,则将按预期调用折叠。 问题很可能是代表设置得太晚了,如果没有你的特殊处理,它已经崩溃了。

另一个问题是,当在横向和纵向时,控制器的恢复路径是不同的,因此可能处于奇怪的状态。 由于更改,它无法自动查找现有详细信息视图控制器并创建新实例,并且由于详细信息项的配置错误,拆分视图委托可能会丢弃其中一个或其中一个实例。 在第3步“重新创建视图控制器”下的状态恢复文档中,它表示它会查找已创建的具有相同路径的视图控制器,这种路径在方向/特征更改后因路径不同而进行恢复时可悲地失败。 所以它回到第4步并创建一个全新的空配置错误的细节控制器,这就是你看到控制器配置错误的原因。

要了解恢复标识符路径,请实现应用程序:viewControllerWithRestorationIdentifierPath:coder:在app委托中输出您将在纵向中看到的要恢复的最后一个路径组件,如下所示:

SplitViewController,
MasterNavigationController,
DetailNavigationController,
DetailViewController

...对应于拆分视图控制器的单层次主要(注意:DetailNavigationController是此配置中隐藏的嵌套导航控制器)。

在景观中,最后两个要恢复的是:

SplitViewController,
MasterNavigationController,
MasterViewController

SplitViewController,
DetailNavigationController,
DetailViewController

...对应于拆分视图的主要和次要控制器层次结构。

因此,现在知道DetailViewController的恢复路径可能不同,您可以理解,如果您尝试在故事板在横向中初始化时自动恢复纵向路径,则无法找到该详细视图控制器并求助于创建新的控制器。 因此,我认为无论恢复路径如何保存,解决方案都是帮助找到它:

- (UIViewController *)application:(UIApplication *)application viewControllerWithRestorationIdentifierPath:(NSArray *)identifierComponents coder:(NSCoder *)coder{
    if([identifierComponents.lastObject isEqualToString:@"DetailViewController"]){
        UISplitViewController *splitViewController = (UISplitViewController *)self.window.rootViewController;
            UINavigationController *secondaryNavigationController = splitViewController.viewControllers.lastObject;;
            DetailViewController *detail = (DetailViewController *)secondaryNavigationController.viewControllers.firstObject;
        return detail;
    }
    return nil;
}

现在,恢复将正确使用正确配置的现有详细控制器,并且拆分视图委托不会抛弃它,导致您留下主控。

此问题可以表现的另一种方式是在恢复后看到两个细节控制器被推入导航堆栈,如果您强制拆分视图委托不丢弃初始细节控制器,并且当修复创建另一个时,您最终会发生这种情况两个推!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM