保存并还原UINavigation堆栈以重新连接

包层包层

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

我正在使用一个情节提要,并且有很多ViewController,并且我想在应用终止时保存所有导航堆栈,以便能够在用户重新启动应用时恢复所有导航。

我正在将其UINavigationController与另一个UINavigationController一起使用,仅供参考。

我找到了这个并且读了一遍遍:https : //developer.apple.com/library/ios/featuredarticles/ViewControllerPGforiPhoneOS/PreservingandRestoringState.html#//apple_ref/doc/uid/TP40007457-CH28-SW34

(必需)为要保留其配置的视图控制器分配恢复标识符;请参阅标记View Controllers for Preservation。

(必需)告诉iOS如何在启动时创建或定位新的视图控制器对象;请参阅在启动时还原View Controller。

然后我RestorationId在所有ViewController上添加了一个,但是我不明白第二部分应该做什么,因为当我添加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];
}

但是,当我回到应用程序中时,苹果统计信息告诉我约束未得到遵守,并且应用程序将崩溃,然后当我在导航堆栈中添加viewControllers时,它确实崩溃了:)

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

斯托尔

您是否在应用程序委托中实现了application:shouldRestoreApplicationState:application: shouldSaveApplicationState:方法。希望能为您提供帮助:

1.设置恢复标识符

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

  • 一种。为视图的restoreIdentifier属性分配一个有效的字符串。

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

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

--

2.告诉您要使用状态保存的应用程序

将这两种方法添加到应用程序委托.m文件中,以既需要保存又需要恢复应用程序状态

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

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

3.写入和读取控制器状态

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

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

4.还原ViewController

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

+ (nullable UIViewController *)viewControllerWithRestorationIdentifierPath:(NSArray *)identifierComponents coder:(NSCoder *)coder{
    ViewControllerThree * restoreVc;
    UIStoryboard* storyBoard = [coder decodeObjectForKey:UIStateRestorationViewControllerStoryboardKey];
    if (storyBoard) {
        restoreVc = (ViewControllerThree*)[storyBoard instantiateViewControllerWithIdentifier:@"ViewControllerThree"];
        restoreVc.restorationIdentifier = [identifierComponents lastObject];
        restoreVc.restorationClass = [ViewControllerThree class];
    }
    return restoreVc;
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

TCP连接-保持连接还是重新连接?

来自分类Dev

核心蓝牙状态保存和还原不起作用,无法将应用重新启动到后台

来自分类Dev

SQLAlchemy会话重新连接

来自分类Dev

通过JSON通过Draw2D.js touch中的连接保存和还原矩形

来自分类Dev

与pySerial重新连接

来自分类Dev

重新连接插座

来自分类Dev

重新连接logcat窗口

来自分类Dev

保存和还原终端内容

来自分类Dev

BLE后台重新连接

来自分类Dev

如何保存和还原AndroidWidgetHostViews

来自分类Dev

扩散重新连接超时

来自分类Dev

Android重新加载碎片堆栈还原

来自分类Dev

撰写:重新组合或还原

来自分类Dev

FFMPEG-流到RTMP输出并同时保存到MP4-重新连接

来自分类Dev

重新启动后保存并还原终端

来自分类Dev

重新启动后还原tmux会话

来自分类Dev

使用UINavigation保存后如何返回?

来自分类Dev

通过JSON通过Draw2D.js touch保存和还原带有连接的矩形

来自分类Dev

重新连接插座

来自分类Dev

碎片何时重新连接?

来自分类Dev

在14.04.3上还原为Utopic堆栈

来自分类Dev

重新合并之前已还原的github分支

来自分类Dev

保存/还原桌面会话

来自分类Dev

保存和还原窗口位置

来自分类Dev

保存TPM初始化密钥,重新初始化,然后还原

来自分类Dev

保存WindowState并在重新启动/重新登录后将其还原

来自分类Dev

页面重新加载后还原primefaces documentViewer

来自分类Dev

Android重新加载碎片堆栈还原

来自分类Dev

保存和还原片段状态