How to set initial values for NSUserDefault Keys?

20,342

Solution 1

You should use the registerDefaults method of NSUserDefaults. Prepare a plist file in your bundle that contains the default preferences and then use that plist to register the defaults.

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

You have to execute this code on every launch of your app. It will add these values to a separate domain in the user defaults hierarchy. Whenever your app's user defaults don't provide a value for a certain key, NSUserDefaults will fall back to this domain and retrieve the value from there.

Solution 2

If you have many default values, let use ola's answer, otherwise this is good for a few params

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

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

    // Set initial values 
    ...

    [defaults synchronize];
}
Share:
20,342

Related videos on Youtube

Suz
Author by

Suz

Scientist/mum turned programmer. iOS Developer at Depict.com art + data + the internet of things

Updated on July 09, 2022

Comments

  • Suz
    Suz almost 2 years

    I want to set some initial values for my NSUserDefault keys so that the first run of the app has some reasonable initial settings. I thought I ran across a simple way to do this in the app bundle .plist, but now I can't find it. Any ideas?

  • Suz
    Suz over 12 years
    It looks like this registers the defaults to a volatile memory location. I don't want it to go back to defaults very often at all. This is mostly for 1st launch. Will the user-set values be preserved, or will they occasionally be over-written by this?
  • Ole Begemann
    Ole Begemann over 12 years
    What do you mean by "volatile memory location"? You have to execute this code on every launch of your app. It will add these values to a separate domain in the user defaults hierarchy. Whenever your app's user defaults don't provide a value for a certain key, NSUserDefaults will fall back to this domain and retrieve the value from there.
  • Suz
    Suz over 12 years
    The User Defaults Programming Guide lists the NSRegistrationDomain as having a 'volatile' state, as opposed to 'persistent'. So, the user default settings themselves are persistent and the defaults are volatile, and have to be reloaded on every app launch. It just seems odd to me that the 'fall back' value is less persistent than the user setting.
  • Ole Begemann
    Ole Begemann over 12 years
    I agree it seems a little odd but it works just fine and does make sense when you think about it.
  • Dave Batton
    Dave Batton about 12 years
    This really isn't the correct way to to it. Works, but it's not what Apple suggests. Use -registerDefaults as described in the answer by @ole, or add them directly to the NSRegistrationDomain domain.
  • James Webster
    James Webster about 12 years
    I agree. I didn't know about registerDefaults when I wrote this answer but I use it now.
  • Lance
    Lance over 10 years
    @OleBegemann you should move your first comment, or part of it anyway, up into your answer. That was the first time I understood what registerDefaults actually did!