2011-02-08 11 views

Respuesta

81

La diferencia es que el primer código-fragmento de código se registra valores por defecto que se utilizará cuando el usuario no ha realizado ningún cambio en la propiedad".

Por lo tanto, si desea proporcionar una "propiedad" con el nombre de clave "Mensaje de bienvenida", en lugar de que la propiedad devuelva nil inserte un mensaje predeterminado "Bienvenido primer usuario" que se mostrará cuando no ha habido cambios en la propiedad.

Esto simplificará su lógica porque no necesita escribir una prueba if para comprobar si la "propiedad" devuelve cero y luego hacer otro mensaje si este es el caso.

NSString *greeting = [[NSUserDefaults standardUserDefaults] stringForKey:@"Greeting"]; 

if(greeting == nil) { 
    NSLog(@"Welcome first-time user!"); 
} 

El segundo fragmento de código que ha publicado es para configurar la propiedad a otro valor. Tendrá diferentes métodos de configuración (setString, setObject, setBoolean) para establecer valores según el estado de su programa en Userdefaults.

EDITAR ----- Actualizaciones requeridas en el comentario.

El primer método es para registrar los valores por defecto, como su nombre lo indica. La primera vez que acceda a la propiedad con algún nombre de clave, el valor será nil para los objetos, falso para los booleanos o 0 para los números. En lugar de hacer muchas pruebas, etc., si los valores no están establecidos en el programa y luego realiza una acción "predeterminada" como el ejemplo anterior, puede enviar su aplicación con algunos valores ya predefinidos para estas claves.

Un lugar típico para poner el registerDefaults está en el método initializer en la aplicaciónDelegate.

Entonces en algún lugar de su programa, puede que desee establecer los valores de estos campos a continuación, se utiliza el setObject, setString, setBoolean ... y para recuperar utiliza stringForKey, objectForKey ...

Piense en ello como este

registerDefaults es el constructor en el que puede proporcionar valores razonables para el objeto, de lo contrario obtendrá algunos valores predeterminados que ya he escrito. Luego, más adelante, si desea cambiar los atributos del objeto, NO usa el "constructor" sino los métodos set/get.

+0

Hmmm Todavía no entiendo muy bien.¿Quiere decir que puedo establecer la propiedad de @ "algo" a un Objeto utilizando uno de los fragmentos de código, pero solo el primero comprobará si ya tengo el valor escrito antes, ¿es correcto? Si tengo algo escrito antes, no reescribiré el valor, ¿es correcto? –

+0

Respuesta actualizada. – LuckyLuke

+1

¡Gracias por la respuesta actualizada! Solo una pequeña cosa. Si pongo registerDefault en AppDelegate, ¿significa eso que no se llamará más de una vez? Por ejemplo, mi fragmento de código, solo establecerá @ "algo" para un Objeto una vez, ¿correcto? A pesar de que el código se ejecuta en el AppDelegate cada vez que lance la aplicación? –

1

la configuración de usuario se agrupan en dominios ... registerDefaults se utiliza para agregar valores predeterminados para el registro de dominio ..

Usted puede leer acerca de los dominios en Preferences and Settings Programming Guide.

+0

El enlace está muerto –

10

Otra forma de verlo es esta. Si elimina el archivo de preferencias de ~/Library/Preferences, los valores predeterminados establecidos por registerDefaults serán los que se apliquen a la aplicación hasta que se establezcan nuevas preferencias.

30

Para resumir,

[[NSUserDefaults standardUserDefaults] setObject:@"Entropy" forKey:@"kName"] 

salvará "Entropía" en un archivo denominado com.example.Demo.plist en la carpeta/Preferencia Biblioteca (donde com.example.Demo es su ID de paquete, consulte IOS Application Security Part 20 – Local Data Storage)

[[NSUserDefaults standardUserDefaults] setObject:@"Mac OS X" forKey:@"kOS"]; 
NSDictionary *appDefaults = [NSDictionary dictionaryWithObjectsAndKeys: 
           @"Windows", @"kOS", 
           @"Google", @"kSearchEngine", nil]; 
[[NSUserDefaults standardUserDefaults] registerDefaults:appDefaults]; 

NSLog(@"%@", [[NSUserDefaults standardUserDefaults] objectForKey:@"kOS"]); 
NSLog(@"%@", [[NSUserDefaults standardUserDefaults] objectForKey:@"kSearchEngine"]); 
NSLog(@"%@", [[NSUserDefaults standardUserDefaults] objectForKey:@"kBrowser"]); 

imprimirá "Mac OS X", "Google", (nulo)

De hecho, registerDefaults

  • no se guarda en el disco
  • solo establece el valor para las claves que no se han establecido ("kOS" está establecido en setObject:forKey: y "kSearchEngine" no se ha establecido)
  • devuelve 0 para valores escalares, nil de objetos si esa llave no está definida por tanto registerDefaults y setObject:forKey: ("kBrowser" en este caso)

Y el uso de registerDefaults

citado de Preferences and Settings Programming Guide

Si estos valores estándar por defecto no son apropiados para su aplicación, puede registrar su propia defau Valora usando el método registerDefaults: . Este método coloca sus valores predeterminados personalizados en el dominio NSRegistrationDomain , lo que hace que se devuelvan cuando una preferencia no se establece explícitamente.

citado de How to Save Data with NSUserDefaults

Otro consejo es que se puede inicializar NSUserDefaults con un objeto NSDictionary predefinido . Por ejemplo, puede establecer un valor predeterminado para que sea "falso" o "verdadero" antes de que el usuario tenga alguna vez una oportunidad de para interactuar con su programa. En mi caso, a veces creo una matriz que representa todos los niveles de mi juego, y en cada matriz valor guardo un booleano para verificar si un jugador ha terminado el nivel. Para hacer esto, creo el objeto de datos y luego lo registro con NSUserDefaults. Si existe un valor anterior para el objeto, entonces no ocurre nada. De lo contrario, mi objeto blanco se guarda como el “incumplimiento” por defecto

PS: Ole tiene un muy buen artículo que explica en detalle Handling Default Values With NSUserDefaults

+3

Respuesta más simple que la aceptada. – Martin

3

En Swift 2.1.1 Xcode 7.2

añadí este fragmento de la aplicación: didFinishLaunchingWithOptions para inicializar el tintColorsIndex, que es uno de los parámetros que el usuario puede cambiar en la aplicación.

let defaults = NSUserDefaults.standardUserDefaults() 
    defaults.registerDefaults([ 
     "tintColorsIndex" : -1, 
     ]) 

Cuando se inicia la aplicación de la primera vez el tintColorsIndex se le asignará un valor de -1 (un Int). Si el usuario ha cambiado el color mientras usa la aplicación, su preferencia no será anulada en lanzamientos posteriores.

Cuestiones relacionadas