【问题标题】:Save the current status when quit, auto-reload when re-open the app退出时保存当前状态,重新打开应用时自动重新加载
【发布时间】:2011-01-09 09:46:32
【问题描述】:

我正在创建一个简单的应用程序来简单地保存一个人的姓名和与此人关联的号码。我为这样的人创建了一个类:

@interface Person : NSObject {
    NSString *name;
    NSInteger serialNumber;
}

在 mainViewController 中,我创建了一个输入文本字段来输入姓名,然后自动为该人分配一个数字,还有 2 个 UILabel 来显示输入的姓名和序列号。

但是,退出应用程序并重新打开后,所有标签均已清除。我要做的是保持这些变量在退出应用程序时保持原样并显示在标签中。因此,我在应用程序委托中创建了 2 个变量,并尝试在应用程序委托中使用 applicationWillTerminate: 来保存。在 mainViewController 中,我每次输入新名称后都会插入这些代码:

NameAppDelegate *appDelegate = (NameAppDelegate *)[[UIApplication sharedApplication] delegate];
appDelegate.lastPerson.name = aPerson.name;
//currentPerson is an instance variable of the app delegate
appDelegate.lastPerson.serialNumber = aPerson.serialNumber;
NSLog(@"aPerson.serialNumber = %i", aPerson.serialNumber);
NSLog(@"appDelegate.lastPerson.serialNumber = %i", appDelegate.lastPerson.serialNumber);

但是,每次我输入一个新名称时,控制台都会显示 aPerson.serialNumber(在 mainViewController 中)发生了变化,但 appDelegate.lastPerson.serialNumber 却没有变化(它始终为零)。

上面的代码有什么问题吗?

【问题讨论】:

    标签: ios objective-c iphone save


    【解决方案1】:

    使用NSUserDefaults 很容易,这里有一些代码可以帮助您入门:

    - (void)applicationDidFinishLaunching:(UIApplication *)application {
        NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
        appDelegate.lastPerson.name = [defaults stringForKey:@"Name"];
        appDelegate.lastPerson.serial = [defaults stringForKey:@"Serial"];
    
        [window addSubview:[flipViewController view]];
        [window makeKeyAndVisible];
    }
    
    -(void)applicationWillTerminate:(UIApplication *)application {
        NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
        [defaults setString:appDelegate.lastPerson.name forKey:@"Name"];
        [defaults setString:appDelegate.lastPerson.serial forKey:@"Serial"];
        [defaults synchronize];     
    }
    

    您可以在加载后检查任何一个字符串是否为 nil,这表明没有存储值,然后您应该要求用户输入。

    【讨论】:

    • 谢谢大卫。但是我应该将这些代码添加到 appDeleagate.m 还是 mainViewController.m 中? (我的大部分程序都是在 mainViewController.m 中完成的)另外,我有一个问题,即 appDelegate.lastPerson.name 和 appDelegate.lastPerson.serial 没有像我预期的那样改变。即使在为它们分配了一些内容之后,它们也总是显示一个(空)值。
    • 在 AppDelegate 中。 DidFinishLaunching 应该已经存在,因此您无需复制整个内容,只需复制基本部分即可。您可以复制 WillTerminate 并且它应该可以工作,但您必须更改 appDelegate 变量,因为它显然没有正确设置。
    • 好的,我明白了。但我这里还有另一个问题。 appDelegate.lastPerson.name 和 appDelegate.lastPerson.serial 没有像我预期的那样改变。因此,即使我有这些代码,最终我也无法保存默认设置。你知道为什么我不能用我引用的上述代码更新它们吗?
    • 您是否将代码从 appDelegate.lastPerson.name 更改为 lastPerson.name 应该可以使用?你确定 lastPerson 设置正确吗?必须先完成它,然后才能设置它的任何 ivars。
    • 我很确定我已经在应用启动时在 appDelegate 中设置了 lastPerson。顺便说一句,我正在使用 appDelegate.lastPerson.name = aPerson.name(aPerson 是 mainViewController.m 中的变量)通过 mainViewController.m 更新 lastPerson.name 是否会导致问题?
    【解决方案2】:

    你想保存到 NSUserDefaults (documentation)。查看文档中的UserDefaults 示例。

    也可以看看这个问题:

    How to register user defaults using NSUserDefaults without overwriting existing values?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-28
      • 1970-01-01
      • 2011-03-19
      • 1970-01-01
      • 2010-10-16
      • 1970-01-01
      • 1970-01-01
      • 2014-03-09
      相关资源
      最近更新 更多