保存和恢复 uinavigationcontroller 的状态

Posted

技术标签:

【中文标题】保存和恢复 uinavigationcontroller 的状态【英文标题】:Save and restore state of uinavigation controller 【发布时间】:2012-10-17 13:34:58 【问题描述】:

我的 UINavigationController 有问题。

我有一个应用程序,它有很多视图控制器,我在使用导航控制器推送和弹出功能之间切换。

我的要求是这样的:在我的应用程序中,当用户在第 5 个屏幕上并且用户单击主页按钮并再次双击主页按钮并从多任务栏中删除或终止应用程序,然后用户点击应用程序图标(打开应用程序) 应用程序应该从它离开的地方开始,或者应用程序应该从第 5 个屏幕开始。

我在 applicationDidEnterBackground 和 applicationDidBecomeActive 的应用程序委托中编写代码,但它对我没有帮助

- (void)applicationDidEnterBackground:(UIApplication *)application

    // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. 
    // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.

    self.viewArray = [[NSMutableArray alloc] init];
    UINavigationController* navController = self.navigationController;
    int viewcountt = [navController.viewControllers count];

    NSLog(@"descbefor -- %@",[navController.viewControllers description]);
    NSLog(@"kountbefor -- %d",[navController.viewControllers count]);


    for (int cont=0; cont < viewcountt; cont++)
    
        [self.viewArray addObject:[navController.viewControllers objectAtIndex:cont]];

    

我尝试保存 self.viewArray 但无法保存。并检索。

这样行不行。

谢谢。

【问题讨论】:

【参考方案1】:

我正在做类似的事情并创建了一个类来将不同分支的状态保存到NSUserDefaults。当每个场景加载时,我调用一个类方法来保存当前场景为分支名称。

这是课程:

接口文件:

#import <Foundation/Foundation.h>

@interface SceneController : NSObject

+(NSString *)getSceneNameWithBranchName:(NSString *)name;

+(void)saveSceneNameWithBranchName:(NSString *)name andSceneName:(NSString *)sceneName;

@end

实现文件:

#import "SceneController.h"

@implementation SceneController

+(NSString *)getSceneNameWithBranchName:(NSString *)name 
    NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
    NSString *sceneName = [prefs valueForKey:name];

    return sceneName;


+(void)saveSceneNameWithBranchName:(NSString *)name andSceneName:(NSString *)sceneName 
    NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
    [prefs setValue:sceneName forKey:name];
    [prefs synchronize];


@end

这对我来说效果很好,并且可以在应用重新启动后继续存在。

【讨论】:

以上是关于保存和恢复 uinavigationcontroller 的状态的主要内容,如果未能解决你的问题,请参考以下文章

uinavigationcontroller 在 iOS 中失去状态恢复的色彩

弹出 UINavigationController 时崩溃

UIScrollView 无法正确恢复

切换标签栏项目时,UINavigationController 如何将其整个视图控制器表示层次结构保存在内存中?

[程序员指南5]保存和恢复

将取消 UIButton 添加到 UINavigationcontroller