【问题标题】:NSUserDefaults Reset First RunNSUserDefaults 重置首次运行
【发布时间】:2012-11-24 20:16:00
【问题描述】:

我在 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。对我应该在这里做什么有什么想法吗?

【问题讨论】:

标签: objective-c ios nsuserdefaults appdelegate


【解决方案1】:

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

在应用启动时你会这样做:

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

就是这样。每次运行应用程序时调用它。这些默认值实际上并没有持久化。仅当键还没有显式值时才返回该值。您可以随意更新这些默认值,而不会影响任何现有值。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 不确定是谁标记了这个答案,但对于我的问题和我所描述的,这是最简单的。
    • 在您的应用程序的第 10 版中,您只需添加 notFirstRunTen。由于这个问题,注册默认值是优越的。另一件事是,通过注册,您实际上可以更改现有用户的默认值。使用firstRun 方法,您永远无法区分用户设置的值和用户未触及的值。顺便说一句,我没有投反对票。
    • @MatthiasBauch 只有在我不断添加需要设置新默认值的新功能时才会发生这种情况。如果我不这样做,所有新的更新都将只使用这两个键。
    • 根据我的经验,这正是将会发生的事情。您将在以后的版本中添加更多设置。您还想更改现有值的默认值。我不止一次这样做。但是你可以随心所欲地去做。在我犯了 firstRun 错误之后,我才知道registerDefaults:。如果更好只是稍微难一点并且将来会更简单,请不要追求简单;-)
    【解决方案3】:

    我建议执行以下操作:

    • 检查存储应用版本的 userdefaults 是否等于当前版本,如果不是。
    • 存储当前应用版本并进行首次启动初始化

      代码

    `

     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
     ......
     }`
    

    【讨论】:

      猜你喜欢
      • 2014-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-08
      • 1970-01-01
      相关资源
      最近更新 更多