2011-02-08 4 views

risposta

81

La differenza è che il primo pezzo di codice si registra valori di default che verrà utilizzato quando l'utente non ha fatto alcuna modifica la proprietà".

Quindi, se si desidera fornire diciamo una "proprietà" con il nome chiave "messaggio di benvenuto", è possibile che anziché restituire la proprietà nil, inserire un messaggio predefinito "Primo utente benvenuto" che verrà visualizzato quando non ci sono stati cambiamenti alla proprietà.

Ciò semplifica la logica perché non è necessario scrivere un test if per verificare se la "proprietà" restituisce nil e quindi creare un altro messaggio se questo è il caso.

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

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

Il secondo snippet di codice che hai postato è per l'impostazione della proprietà su un altro valore. Saranno disponibili diversi metodi set (setString, setObject, setBoolean) per impostare i valori in base allo stato del programma in Userdefaults.

MODIFICA ----- Aggiornamenti come richiesto nel commento.

Il primo metodo è per la registrazione dei valori ai valori predefiniti, come suggerisce il nome. La prima volta che si accede alla proprietà con un nome di chiave, il valore sarà nullo per gli oggetti, falso per i booleani o 0 per i numeri. Invece di fare molti test e così via, se i valori non sono impostati nel programma, e quindi fare un'azione "predefinita" come nell'esempio precedente, puoi spedire la tua applicazione con alcuni valori già predefiniti per queste chiavi.

Un luogo tipico in cui inserire registerDefaults si trova nel metodo initializer in appDelegate.

Poi da qualche parte nel vostro programma si consiglia di impostare i valori di questi campi, allora si utilizza il setObject, setString, setBoolean ... e per il recupero si utilizza stringForKey, objectForKey ...

Pensate a come questo

Il registerDefaults è il costruttore in cui è possibile fornire valori sensibili per l'oggetto, altrimenti si ottengono alcuni valori predefiniti che ho già scritto. Successivamente, se si desidera modificare gli attributi dell'oggetto NON si usa il "costruttore" ma i metodi set/get.

+0

Hmmm Ancora non capisco.Quindi vuoi dire che posso impostare la proprietà di @ "qualcosa" su anObject usando uno dei frammenti di codice, ma solo il primo controllerà se ho già il valore scritto prima, è corretto? Se ho già qualcosa scritto prima, non scriverò di nuovo il valore, è corretto? –

+0

Risposta aggiornata. – LuckyLuke

+1

Grazie per la risposta aggiornata! Solo una piccola cosa .. Se metto registerDefault in AppDelegate, vuol dire che non sarà chiamato più di una volta? Ad esempio il mio frammento di codice, sarà impostato su @ "qualcosa" per anObject una volta, corretto? Anche se il codice viene eseguito in AppDelegate ogni volta che avvio l'app? –

1

opzioni predefinite dell'utente sono raggruppati in domini ... registerDefaults viene utilizzata per aggiungere impostazioni predefinite al dominio di registrazione ..

Si può leggere sui domini in Preferences and Settings Programming Guide.

+0

Il collegamento è morto –

10

Un altro modo di guardarlo è questo. Se elimini il file delle preferenze da ~/Libreria/Preferenze, i valori predefiniti impostati da registerDefaults saranno quelli applicabili all'applicazione fino a quando non verranno impostate nuove preferenze.

30

lunga storia breve,

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

salverà "Entropy" in un file denominato com.example.Demo.plist nella cartella/Libreria Preferenze (dove com.example.Demo è il tuo ID Bundle, vedere 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"]); 

stamperà "Mac OS X", "Google", (null)

Infatti, registerDefaults

  • non salva sul disco
  • imposta solo il valore per le chiavi che non sono state impostate ("kOS" è impostato da setObject:forKey: e "kSearchEngine" non è impostato)
  • restituisce 0 per i valori scalari, nil per gli oggetti se questa chiave non è impostata sia registerDefaults e setObject:forKey: ("kBrowser" in questo caso)

E l'utilizzo di registerDefaults

Citato da Preferences and Settings Programming Guide

Se questi valori predefiniti standard non sono appropriati per la vostra applicazione, si possibile registrare il proprio Sottotito Valori usando il metodo registerDefaults: . Questo metodo colloca i valori predefiniti personalizzati nel dominio NSRegistrationDomain, che fa sì che vengano restituiti quando una preferenza non è impostata in modo esplicito.

Citato da How to Save Data with NSUserDefaults

Un altro suggerimento è che è possibile inizializzare i tuoi NSUserDefaults con un oggetto NSDictionary predefinito . Pertanto, ad esempio, è possibile impostare un valore predefinito "falso" o "vero" prima che l'utente abbia mai avuto la possibilità di interagire con il programma con la possibilità di . Nel mio caso, a volte creo un array che rappresenta tutti i livelli nel mio gioco, e in ogni array valore memorizzo un booleano per verificare se un giocatore ha completato il livello. Per fare ciò creo l'oggetto dati e quindi lo registro con NSUserDefaults. Se esiste un valore precedente per l'oggetto, allora non succede nulla. In caso contrario, il mio oggetto vuoto viene salvato come “default” default

PS: Ole ha un ottimo articolo che spiega in dettaglio Handling Default Values With NSUserDefaults

+3

Risposta più semplice di quella accettata. – Martin

3

In Swift 2.1.1 Xcode 7.2

ho aggiunto questo snippet all'applicazione: didFinishLaunchingWithOptions per inizializzare il tintColorsIndex, che è uno dei parametri che l'utente può modificare nell'app.

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

Quando l'applicazione viene avviata la prima volta il tintColorsIndex verrà assegnato un valore di -1 (un int). Se l'utente ha cambiato il colore durante l'utilizzo dell'app, le sue preferenze non verranno sovrascritte ai successivi lanci.