2011-12-12 17 views
40

Quiero establecer algunos valores iniciales para mis claves NSUserDefault para que la primera ejecución de la aplicación tenga algunas configuraciones iniciales razonables. Pensé que me encontré con una forma simple de hacer esto en el paquete de aplicaciones .plist, pero ahora no puedo encontrarlo. ¿Algunas ideas?¿Cómo establecer los valores iniciales para NSUserDefault Keys?

+0

Comprobar esto: http://jayprakashdubey.blogspot.in/2014/07/nsuserdefault -usage.html –

Respuesta

68

Se debe utilizar el método de NSUserDefaultsregisterDefaults. Prepare un archivo plist en su paquete que contenga las preferencias predeterminadas y luego use ese plist para registrar los valores predeterminados.

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

Tiene que ejecutar este código en cada inicio de su aplicación. Agregará estos valores a un dominio separado en la jerarquía de valores predeterminados del usuario. Siempre que los valores predeterminados de usuario de su aplicación no proporcionen un valor para cierta clave, NSUserDefaults recurrirá a este dominio y recuperará el valor desde allí.

+0

Parece que esto registra los valores predeterminados en una ubicación de memoria volátil. No quiero que vuelva a los valores predeterminados muy a menudo. Esto es principalmente para el primer lanzamiento. ¿Se conservarán los valores establecidos por el usuario o se sobreescribirán ocasionalmente con esto? – Suz

+4

¿Qué quiere decir con "ubicación de memoria volátil"? Tienes que ejecutar este código en cada lanzamiento de tu aplicación. Agregará estos valores a un dominio separado en la jerarquía de valores predeterminados del usuario. Siempre que los valores predeterminados de usuario de su aplicación no proporcionen un valor para cierta clave, 'NSUserDefaults' volverá a este dominio y recuperará el valor desde allí. –

+0

La Guía de programación predeterminada del usuario enumera que NSRegistrationDomain tiene un estado 'volátil', en oposición a 'persistente'. Por lo tanto, la configuración predeterminada del usuario en sí misma es persistente y los valores predeterminados son volátiles y deben volver a cargarse en cada inicio de la aplicación. Me parece extraño que el valor de "retroceso" sea menos persistente que la configuración del usuario. – Suz

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]; 
} 

NB: No se ha probado, hecho de la memoria

+1

Esto realmente no es la forma correcta de hacerlo. Funciona, pero no es lo que sugiere Apple. Utilice -registerDefaults como se describe en la respuesta por @ole, o agréguelos directamente al dominio NSRegistrationDomain. –

+0

Estoy de acuerdo. No sabía sobre registerDefaults cuando escribí esta respuesta, pero la uso ahora. –

5

Si tiene muchos valores por defecto, vamos a utilizar ola's answer, de lo contrario esto es bueno para unos parametros

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 

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

    // Set initial values 
    ... 

    [defaults synchronize]; 
} 
-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:@""] 
     ) 
    { 
     [email protected]"0.5"; 
    } 

    _floatAdmob=strDefSetting.floatValue;//0.5; 
} 
Cuestiones relacionadas