NSUserDefaults重置首次运行

时间:2012-11-24 20:16:01

标签: objective-c ios nsuserdefaults appdelegate

我在AppStore中已经有一个使用NSUserDefaults的应用程序。一些默认设置是我在应用首次启动时设置的默认设置,然后允许用户稍后更改它们。所以,在我的AppDelegate appDidFinishLaunchingWithOptions中,我把:

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

if (! [defaults boolForKey:@"notFirstRun"]) {

    [defaults setBool:YES forKey:@"notFirstRun"];

    [defaults setInteger:0 forKey:@"verseKey"];
    [defaults synchronize];
}

我现在遇到的问题是我想在NSUserDefault类别中添加更多默认设置,所以我想让它看起来像这样:

 NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

if (! [defaults boolForKey:@"notFirstRun"]) {

    [defaults setBool:YES forKey:@"notFirstRun"];
    NSString *smalltitle = @"4";
    NSString *smallarticle = @"3";
    [defaults setObject:smalltitle forKey:@"Title"];
    [defaults setObject:smallarticle forKey:@"Article"];
    [defaults setInteger:0 forKey:@"verseKey"];
    [defaults synchronize];
}

我知道这会给那些已经下载了应用的人带来问题,并且只是更新它。他们不会运行该代码,因为notFirstRun Bool已经设置为YES。关于我应该在这做什么的任何想法?

3 个答案:

答案 0 :(得分:6)

正确的解决方案是不使用默认值实际填充NSUserDefaults。相反,请使用registerDefaults:方法。

在应用启动时,您可以:

NSUserDefaults *default = [NSUserDefaults standardUserDefaults];
[defaults registerDefaults:@{
    @"Title" : @"4",
    @"Article" : @"3",
    @"verseKey" : @0
}];

就是这样。每次运行应用程序时都调用此方法。这些默认值实际上不会保留。仅当密钥没有明确值时才返回该值。您可以在不影响任何现有值的情况下更新这些默认值。

答案 1 :(得分:0)

制作一个新的notFirstRun布尔值(即notFirstRunTwo)。对于现有用户来说,这也是“不”。

答案 2 :(得分:0)

我建议您执行以下操作:

  • 如果存储的应用版本等于当前版本,则检查用户默认值,如果不是,则检查用户默认值。
  • 存储当前应用版本并执行首次启动初始化

    代码

`

 NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
 NSString *appVersion = [NSString stringWithFormat:@"%@",[[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleShortVersionString"]];

 if (! [defaults objectForKey:appVersion ])
 { 
  /// store the current version and then do your first run functions
      [defaults setObject:[NSNumber numberWithInt:1] forKey:appVersion];
   /// here do your first run
 ......
 }`