NSUserDefaults重置首次运行

use*_*452 1 objective-c nsuserdefaults ios 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];
}
Run Code Online (Sandbox Code Playgroud)

我现在遇到的问题是我想在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];
}
Run Code Online (Sandbox Code Playgroud)

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

rma*_*ddy 6

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

在app启动时,您可以:

NSUserDefaults *default = [NSUserDefaults standardUserDefaults];
[defaults registerDefaults:@{
    @"Title" : @"4",
    @"Article" : @"3",
    @"verseKey" : @0
}];
Run Code Online (Sandbox Code Playgroud)

而已.每次运行应用程序时都调用此方法.这些默认值实际上不会保留.仅当密钥没有明确值时才返回该值.您可以根据需要更新这些默认值,而不会影响任何现有值.