¿Para qué sirve – ?

Cuál es la diferencia entre:

[[NSUserDefaults standardUserDefaults] registerDefaults: [NSDictionary dictionaryWithObjectAndKey:anObject, @"something"]]; 

Y esto:

 [[NSUserDefaults standardUserDefaults] setObject:anObject forKey:@"something"]; 

La diferencia es que el primer fragmento de código registra los valores predeterminados que se usarán cuando el usuario no haya realizado ningún cambio en la “propiedad”.

Entonces, si desea proporcionar una “propiedad” con el nombre de clave “Mensaje de bienvenida”, en lugar de que la propiedad devuelva nada, inserte un mensaje predeterminado “Bienvenida usuario por primera vez” que se mostrará cuando no haya habido ninguna cambios a la propiedad.

Esto simplificará su lógica porque no necesita escribir una prueba if para verificar 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 establecer la propiedad a otro valor. Tendrá diferentes métodos de configuración (setString, setObject, setBoolean) para establecer valores según el estado de su progtwig en Userdefaults.

EDIT —– Actualizaciones según lo solicitado en el comentario.

El primer método es para registrar valores predeterminados, 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 progtwig 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 de inicialización en la aplicaciónDelegate.

Entonces, en algún lugar de su progtwig, es posible que desee establecer los valores de estos campos, luego use setObject, setString, setBoolean … y para recuperarlo use stringForKey, objectForKey …

Piénselo así

El registerDefaults es el constructor donde 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.

Larga historia corta,

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

guardará “Entropy” en un archivo llamado com.example.Demo.plist en la carpeta Biblioteca / Preferencias (donde com.example.Demo es su ID de paquete, consulte Seguridad de la aplicación IOS, Parte 20 – Almacenamiento de datos local )

 [[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 guarda en el disco
  • solo establece el valor de las claves que no se han establecido (“setKO” está establecido por setObject:forKey: y “kSearchEngine” no está configurado)
  • devuelve 0 para valores escalares, nil para objetos si esa clave no está establecida por ambos registerDefaults y setObject:forKey: (“kBrowser” en este caso)

Y el uso de registerDefaults

Citado de Preferencias y Configuraciones Guía de Progtwigción

Si estos valores predeterminados estándar no son apropiados para su aplicación, puede registrar sus propios valores predeterminados utilizando 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 Cómo guardar datos con NSUserDefaults

Otro consejo es que puede inicializar sus NSUserDefaults con un objeto NSDictionary predefinido. Entonces, por ejemplo, puede establecer un valor predeterminado para que sea “falso” o “verdadero” antes de que el usuario haya tenido la oportunidad de interactuar con su progtwig. En mi caso, a veces creo una matriz que representa todos los niveles en mi juego, y en cada valor de matriz, almaceno 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 en blanco se guarda como los valores predeterminados “predeterminados”

PD: Ole tiene un artículo muy bueno que explica Manejo de valores predeterminados con NSUserDefaults en detalle

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

En Swift 2.1.1 Xcode 7.2

Agregué este fragmento a la aplicación: didFinishLaunchingWithOptions para inicializar 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 la primera vez que 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.

Los valores predeterminados del usuario se agrupan en dominios … registerDefaults se usa para agregar los valores predeterminados al dominio de registro.

Puede leer sobre los dominios en la Guía de progtwigción de preferencias y configuraciones .