使用自定义容器视图控制器(MMDrawerController)进行iOS状态恢复



设置

我有一个滑动菜单自定义容器视图控制器(MMDrawerController),用于控制中心视图控制器和滑出左侧菜单/抽屉。就像Facebook应用程序和其他数百个应用程序一样。

打开左侧的抽屉并点击菜单项可替换中央视图控制器。

工作原理

如果我打开应用程序,按下第一个中心视图控制器上的按钮(改变背景颜色),我可以杀死应用程序并成功恢复背景颜色。完美的

什么不起作用

如果我选择另一个中心vc加载(打开菜单/抽屉并选择菜单选项),然后杀死该应用程序,该应用程序将不会恢复到该视图控制器。

我在做什么

在我的父视图控制器中,我对左视图控制器和中视图控制器进行编码,以便在恢复时重新创建它们。

- (void)encodeRestorableStateWithCoder:(NSCoder *)coder
{
    [coder encodeObject:self.centerViewController forKey:@"centerVC"];
    [coder encodeObject:self.leftDrawerViewController forKey:@"leftDrawerVC"];
    [super encodeRestorableStateWithCoder:coder];
}
- (void)decodeRestorableStateWithCoder:(NSCoder *)coder
{
    // if I don't change the center view controller, these values
    // get logged out as expected
    NSLog(@"leftDrawer: %@", [coder decodeObjectForKey:@"leftDrawerVC"]);
    NSLog(@"center: %@", [coder decodeObjectForKey:@"centerVC"]);
    [super decodeRestorableStateWithCoder:coder];
}

在我更改第一个中心视图控制器上的颜色的流程中,在解码过程中,我可以成功地返回中心视图控制器和左视图控制器。然而,在我选择一个新的中心vc加载的流中,在解码过程中,这些对象为零。

我如何设置我的自定义容器视图控制器,以正确编码对其子对象的引用,从而保证在解码时将它们取回?

更新1

在运行完无法正确恢复的场景后,我使用restorationArchiveTool检查了存档,事实上,存档确实包含了我所期望的编码对象的层次结构。我仍然不明白为什么那些以前编码的视图控制器在解码过程中最终为空。

更新2如果你看一下这个要点的注释部分,你可以看到所有正确的编码/解码调用似乎都发生在保存和恢复上。我想知道,在我的应用程序委派中,当我最初设置根视图控制器(mmdrawercontroller的实例)时,我是否以某种方式破坏了状态恢复?我在做什么:

- (BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    UINavController *centerNav = [[UINavController alloc] initWithRootViewController:[FeaturedViewController new]];
    centerNav.restorationIdentifier = @"centerNav";
    UINavigationController *leftDrawerNavController = [[UINavigationController alloc] initWithRootViewController:[LeftDrawerViewController new]];
    leftDrawerNavController.restorationIdentifier = @"leftDrawerNav";
    MMDrawerController *drawerViewController = [[MMDrawerController alloc] initWithCenterViewController:centerNav leftDrawerViewController:leftDrawerNavController];
    // no restoration class, since this will always be created before state restoration resumes, and therefore will be found implicitly
    [drawerViewController setRestorationIdentifier:@"mmDrawer"];
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    self.window.rootViewController = drawerViewController;
    self.window.restorationIdentifier = NSStringFromClass([UIWindow class]);
    self.window.backgroundColor = [UIColor whiteColor];
    [self.window makeKeyAndVisible];
    return true;
}

我对MMDrawerController也做过类似的操作,我认为问题在于您没有为UIKit提供在恢复状态时创建所有可能的中心视图控制器的方法。请注意,当您对控制器进行编码时,所保存的只是该控制器的恢复ID。要在下次启动应用程序时恢复,UIKit需要能够获得控制器的实例——它本身不会创建一个实例。它将尝试各种方法来获得所述实例,如下所列:

http://developer.apple.com/library/ios/#documentation/iphone/conceptual/iphoneosprogrammingguide/StatePreservation/StatePreservation.html#//apple_ref/doc/uid/TP40007072-CH11-SW10

你的应用程序可能每次都会创建默认的中心控制器(通过情节提要或手动),这样就可以工作了。对于其他人,您可能需要在委托中实现一个恢复类或实现application:viewControllerWithRestorationIdentifierPath:coder:,并让它返回正确类型的新实例。

相关内容

  • 没有找到相关文章

最新更新