【发布时间】:2016-11-16 05:26:04
【问题描述】:
我目前很难理解应该使用什么来保存和恢复我的应用状态。
我正在使用情节提要,并且我有很多 ViewController,我想在应用程序终止时保存我的所有导航堆栈,以便在用户重新启动应用程序时能够恢复所有导航。
我使用 UINavigationController 和其中的另一个 UINavigationController 只是为了提供信息。
(必需)将恢复标识符分配给要保留其配置的视图控制器;请参阅标记视图控制器以进行保存。
(必需)告诉 iOS 如何在启动时创建或定位新的视图控制器对象;请参阅在启动时恢复视图控制器。
然后我在我的所有 ViewControllers 上添加了一个 RestorationId,但我不明白我应该为第二部分做什么,因为当我添加 viewControllerWithRestorationIdentifierPath 方法时,我没有传入。
我还尝试将navigation.viewcontrollers 保存到 NSUserDefaults 中,以便在用户重新启动应用程序时再次使用它们
使用代码:
+(NSArray *) getNavStatus
{
NSUserDefaults *preferences = [NSUserDefaults standardUserDefaults];
id objectSaved;
if( (objectSaved = [preferences objectForKey:navStatusKey]) != nil)
return [NSKeyedUnarchiver unarchiveObjectWithData:objectSaved];
else
return nil;
}
+(BOOL) saveNavStatus:(UINavigationController *) nav
{
NSUserDefaults *preferences = [NSUserDefaults standardUserDefaults];
NSData *encodedObject = [NSKeyedArchiver archivedDataWithRootObject:nav.viewControllers];
[preferences setObject:encodedObject forKey:navStatusKey];
// Save to disk
return [preferences synchronize];
}
但是当我返回应用程序时,Apple stats 告诉我约束没有受到尊重并且应用程序将崩溃,然后当我在导航堆栈中添加 viewControllers 时它确实崩溃了 :)
任何提示或帮助将不胜感激。 非常感谢
【问题讨论】:
-
你实现
encodeRestorableStateWithCoder:和decodeRestorableStateWithCoder:了吗?您也可以查看本教程。它会帮助你。 techotopia.com/index.php/… -
我现在做了我可以得到一些恢复,但正如我所说我想在自己杀死应用程序后做同样的过程,但是当用户杀死它时,下次启动时不会启动恢复,那么有没有办法强制呢?
-
根据上述恢复 viewControllers 状态,当您从拉伸重新启动应用程序时,它不会工作。在这种情况下,Apple 的默认恢复导航状态将不起作用,但您可以在数据库中保存此用户状态并在应用程序打开时通过手动编程逻辑恢复它,但上述问题没有解决方案,但是这个逻辑如果您有 7-8 导航推送,则仅适用于 3-4 导航推送。
-
我实际上尝试过使用
NSUserDefaults,但是当我保存navigationView时,我只是被拒绝^^并且应用程序崩溃。我的推力很大(我认为大约 15)
标签: ios objective-c uinavigationcontroller save restore