gpt4 book ai didi

iphone - 带有自定义容器 View Controller (MMDrawerController) 的 iOS 状态恢复

转载 作者:行者123 更新时间:2023-11-29 13:08:38 25 4
gpt4 key购买 nike

设置

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

打开左侧的抽屉并点击菜单项会替换中心 View Controller 。

什么在起作用

如果我打开应用程序,按下第一个中心 View Controller 上的按钮(它会更改背景颜色),我可以终止应用程序并成功恢复背景颜色。完美的。

什么不起作用

如果我选择另一个中心 vc 来加载(通过打开菜单/抽屉并选择一个菜单选项)然后终止该应用程序,该应用程序将不会恢复到该 View Controller 。

我在做什么

在我的父 View Controller 中,我正在对左侧和中心 View Controller 进行编码,以便我可以在恢复时重新创建它们。

- (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];
}

在我更改第一个中心 View Controller 颜色的流程中,在解码期间我可以成功取回中心和左侧 View Controller 。但是,在我选择要加载的新中心 vc 的流程中,解码期间这些对象为零。

我如何设置我的自定义容器 View Controller 以保证在解码时取回它们的方式正确编码对其子项的引用?

更新 1

使用 restorationArchiveTool在运行完未正确还原的场景后,我检查了存档,存档实际上包含我期望的编码对象的层次结构。我仍然不明白为什么那些以前编码的 View Controller 在解码过程中最终为空。

更新 2如果您查看 this gist 的评论部分,您可以看到所有正确的编码/解码调用似乎都在保存和恢复时发生。我想知道在我的应用程序委托(delegate)中,当我最初设置我的 Root View Controller (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 提供一种在恢复状态时创建所有可能的中心 View Controller 的方法。请注意,当您对 Controller 进行编码时,保存的只是该 Controller 的恢复 ID。要在您下次启动应用程序时恢复,UIKit 需要能够获取 Controller 的一个实例——它不会自己创建一个。它将尝试各种方法来获取所述实例,如下所列:

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

您的应用可能每次都创建默认的中心 Controller (通过 Storyboard或手动),以便一个可以正常工作。对于其他人,您可能需要实现恢复类或在委托(delegate)中实现 application:viewControllerWithRestorationIdentifierPath:coder: 并让它返回正确类型的新实例。

关于iphone - 带有自定义容器 View Controller (MMDrawerController) 的 iOS 状态恢复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17934668/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com