保存并恢复UINavigation堆栈以重新连接

时间:2016-07-13 14:40:38

标签: ios objective-c uinavigationcontroller save restore

我目前很难理解保存和恢复应用状态应该用什么。

我正在使用故事板,我有一些ViewControllers,我想在应用程序终止时保存所有导航堆栈,以便在用户重新启动应用程序时能够恢复所有导航。

我在其中使用UINavigationController和其他UINavigationController仅供参考。

我发现了这一点并一遍又一遍地阅读: https://developer.apple.com/library/ios/featuredarticles/ViewControllerPGforiPhoneOS/PreservingandRestoringState.html#//apple_ref/doc/uid/TP40007457-CH28-SW34

  

(必需)将恢复标识符分配给要保留其配置的视图控制器;请参阅标记视图控制器以进行保留。

     

(必需)告诉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时它会崩溃:)< / p>

任何提示或帮助将不胜感激。 非常感谢

1 个答案:

答案 0 :(得分:4)

您是否在应用程序委托中实现了{ "variable": { "name": "string", "type": ["string", "integer"] } } application:shouldRestoreApplicationState:方法。希望这一步可以帮助你:

<强> 1。设置恢复标识符

分配恢复标识符时,请记住视图控制器层次结构中的所有父视图控制器也必须具有恢复标识符。还包括NavigationController和TabBar ......

  
      
  • 一个。将有效字符串分配给视图的restorationIdentifier属性。

  •   
  • 湾使用具有有效还原标识符的视图控制器中的视图。

  •   
  • ℃。对于表视图和集合视图,请分配采用UIDataSourceModelAssociation协议的数据源。

  •   
     

-

<强> 2。告诉应用程序您想要使用State Preservation

将两个方法添加到应用程序delegate.m文件中,以同时保存和恢复应用程序状态

application: shouldSaveApplicationState:

第3。写入和读取控制器状态

You Preservation Controller必须采用UIStateRestoring协议,并使用该协议的方法来编写和读取其状态。

    -(BOOL)application:(UIApplication *)application shouldRestoreApplicationState:(NSCoder *)coder
{
    return YES;
}

-(BOOL)application:(UIApplication *)application shouldSaveApplicationState:(NSCoder *)coder
{
    return YES;
}

<强> 4。恢复ViewController

实现viewControllerWithRestorationIdentifierPath:coder:关联恢复类的方法,以检索视图控制器。

-(void)encodeRestorableStateWithCoder:(NSCoder *)coder
    {
        if (_textLabel.text.length > 0) {
            [coder encodeObject:_textLabel.text forKey:@"labelText"];
        }
        [super encodeRestorableStateWithCoder:coder];
    }

    -(void)decodeRestorableStateWithCoder:(NSCoder *)coder
    {
        _textLabel.text = [coder decodeObjectForKey:@"labelText"];
        [super decodeRestorableStateWithCoder:coder];
    }