如何为NSUserDefault键设置初始值?

43

我希望为我的NSUserDefault键设置一些初始值,以便应用程序的第一次运行具有一些合理的初始设置。 我曾认为在应用程序包的.plist文件中有一种简单的方法可以实现这一点,但现在我找不到它了。 有什么想法吗?


请查看此链接:http://jayprakashdubey.blogspot.in/2014/07/nsuserdefault-usage.html - Jayprakash Dubey
4个回答

71

你应该使用NSUserDefaultsregisterDefaults方法。在你的包中准备一个包含默认偏好设置的plist文件,然后使用该plist文件来注册默认值。

NSString *defaultPrefsFile = [[NSBundle mainBundle] pathForResource:@"defaultPrefs" ofType:@"plist"];
NSDictionary *defaultPreferences = [NSDictionary dictionaryWithContentsOfFile:defaultPrefsFile];
[[NSUserDefaults standardUserDefaults] registerDefaults:defaultPreferences];

您需要在每次启动应用程序时执行此代码。 它将将这些值添加到用户默认层次结构中的单独域中。 每当您的应用程序用户默认设置不为某个键提供值时,NSUserDefaults 将退回到此域并从中检索该值。


看起来这将默认值注册到易失性内存位置。我不希望它经常返回默认值。这主要是为了第一次启动。用户设置的值会被保留,还是会被偶尔覆盖? - Suz
4
“volatile memory location”是什么意思?你需要在每次启动应用程序时执行此代码。它将把这些值添加到用户默认层次结构中的单独域中。每当您的应用程序的用户默认设置不为某个键提供值时,“NSUserDefaults”将返回到该域并从其中检索该值。 - Ole Begemann
用户默认设置编程指南将NSRegistrationDomain列为“易失性”状态,而不是“持久性”。因此,用户默认设置本身是持久的,而默认值是易失的,并且必须在每次应用程序启动时重新加载。对我来说,似乎很奇怪的是,“回退”值比用户设置更不持久。 - Suz
1
我同意它看起来有点奇怪,但它运行得很好,在你思考它时也是有意义的。 - Ole Begemann
@OleBegemann,你应该将你的第一条评论或其中的一部分移动到你的答案中。那是我第一次理解registerDefaults实际上是做什么的! - Lance

5
如果您有许多默认值,请使用ola的答案,否则对于少量参数来说这很好。
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

if (![defaults boolForKey:USERDEFAULT_IS_INITIALIZED]) { 
    [defaults setBool:YES forKey:USERDEFAULT_IS_INITIALIZED];

    // Set initial values 
    ...

    [defaults synchronize];
}

0
if ([[[[NSUserDefaults standardUserDefaults] dictionaryRepresentation] allKeys] containsObject:@"initialValuesHaveBeenWritten"])
{
    [[NSUserDefaults standardUserDefaults] setValue:obj1 forKey:key1];
    [[NSUserDefaults standardUserDefaults] setValue:obj2 forKey:key2];


    [[NSUserDefaults standardUserDefaults] setValue:obj1 forKey:@"initialValuesHaveBeenWritten"];

    [[NSUserDefaults standardUserDefaults] synchronize];
}

注意:未经测试,从记忆中完成

1
这并不是正确的做法。虽然可行,但这不是苹果建议的方式。请按照@ole的答案中所述使用-registerDefaults,或直接将它们添加到NSRegistrationDomain域中。 - Dave Batton
我同意。当我写这个答案时,我不知道registerDefaults,但现在我使用它了。 - James Webster

-1
-(void) loadDef
{
    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];

    _removeAd=[userDefaults boolForKey:SAVE_AD_STATUS];

    NSString* strDefSetting=[userDefaults stringForKey:SAVE_STATUS_ADSETTING];
    if(strDefSetting==nil
       ||[strDefSetting isEqualToString:@""]
       )
    {
        strDefSetting=@"0.5";
    }

    _floatAdmob=strDefSetting.floatValue;//0.5;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接