我可以在iPhone OS中关闭时保存我的应用程序状态吗?

时间:2010-04-21 15:18:25

标签: iphone bookmarks

我的应用程序功能很像电子书。我有一堆各种语言的文本信息,可通过多种深入分析方法访问。当用户想要进入他们最后阅读的位置时,他们当前必须浏览部分和章节菜单以回到原来的位置。一个理想的解决方案是设置书签系统,我正在考虑。

但是,如果我没记错,当iPhone OS 4宣布时,他们似乎在保存应用程序状态方面增加了很多功能。这是否意味着有人使用我的阅读器应用程序可以直接退出,做任何事情,然后当他们重新进入时,它就像他们离开时的阅读屏幕一样?

我不太了解如何设置书签系统,我想它值得研究,但我可能想要推迟iPhone OS 4,如果这确实是它能够做到的。任何想法或见解将不胜感激!

4 个答案:

答案 0 :(得分:5)

这在iPhone OS中一直是可行的。大多数人使用NSUserDefaults来存储其应用程序的状态。然后在您的应用程序委托的-applicationDidFinishLaunching方法中,或者无论您在何处设置视图并初始化应用程序状态,只需使用NSUserDefaults恢复您保存的状态。

答案 1 :(得分:5)

正如其他人所指出的那样,这并不是OS4特有的,所以在所有应用程序中实现这一点都是很好的做法。

我建议用户在书中翻页时,例如使用NSUserDefaults保存对该页面的引用,如下所示:

NSUserDefaults *userPreferences = [NSUserDefaults standardUserDefaults];
[userPreferences setObject:currentPageNumber forKey:@"pageNumber"];

当应用程序启动时,您可以阅读此值并采取相应的行动。

[[NSUserDefaults standardUserDefaults] stringForKey:@"pageNumber"];

您可能更愿意在应用程序即将关闭时存储引用,但最好先将其存储(如果应用程序意外退出)


另外,您提到用户可以浏览多种“向下钻取方法”。您可能希望在应用中确切位置的NSMutableArray内保留记录,并将其保存到NSUserDefaults。当你的应用程序启动时,你将处理这个数组中的信息,让用户回到他们离开的地方。

答案 2 :(得分:3)

他们对保存状态的意义是背景应用。电子书应用程序可能不需要在后台运行,因此您仍然需要像操作系统3一样保存和恢复状态.NSUserDefaults适用于此。

答案 3 :(得分:3)

如果您使用的是导航控制器,则可以使用以下代码行来保存应用状态:

NSMutableArray *listOfClasses = [[NSMutableArray alloc] init];
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults removeObjectForKey:@"ViewControllers"];
NSArray *controllers = [_navController viewControllers];

for(UIViewController *VC in controllers)
    [listOfClasses addObject:[NSString stringWithFormat:@"%@",[VC class]]];

[defaults setObject:listOfClasses
             forKey:@"ViewControllers"];
[defaults synchronize];

在申请终止时确实进入后台 并且您可以使用以下代码行来恢复您的应用:

 NSArray *classes = [[NSUserDefaults standardUserDefaults] objectForKey:@"ViewControllers"];
if(classes != nil) {
    for(NSString *class in classes) {
        if([class isEqualToString:@"FirstViewController"]) {
            FirstViewController *viewController  = [[FirstViewController alloc] init];
            [controllers addObject:viewController];
            [viewController release];
        } else if([class isEqualToString:@"SecondViewController"]) {
            SecondViewController *viewController  = [[SecondViewController alloc] init];
            [controllers addObject:viewController];
            [viewController release];
        } else if([class isEqualToString:@"ThirdViewController"]) {
            ThirdViewController *viewController  = [[ThirdViewController alloc] init];
            [controllers addObject:viewController];
            [viewController release];
        } else {

        }
    }
 }

在申请时完成加载