2010-01-16 11 views
33

Ho una classe AppDelegate con il metodo +(void)initialize che uso per registrare alcuni valori predefiniti. Ecco il codice che uso:Come registrare le impostazioni utente predefinite usando NSUserDefaults senza sovrascrivere i valori esistenti?

+ (void)initialize { 
    NSDictionary *defaults = [NSDictionary dictionaryWithObjectsAndKeys:@"NO", @"fooKey", @"YES", @"barKey", nil]; 

    [[NSUserDefaults standardUserDefaults] registerDefaults:defaults]; 
} 

Ho anche creato Preferences.xib che detiene paio di caselle di controllo (NSButton), che stato di visualizzazione delle preferenze. Sono vincolati a NSUserDefaultsController con le stesse chiavi (fooKey e barKey in questo caso). Ogni volta che lancio un'applicazione e cambio i "valori predefiniti", vengono ripristinati al prossimo avvio dell'app.

C'è un modo per registrare "valori predefiniti" senza sovrascrivere valori già esistenti? Forse ogni volta che costruisco e lancio un'applicazione il suo file delle preferenze viene ricreato? Forse dovrei eliminare le checkbox da NSUserDefaultsController e mantenere i valori delle chiavi da solo con un codice personalizzato nel controller della finestra delle preferenze?

Mi piacerebbe sentire la vostra implementazione di scelta per il mantenimento delle impostazioni predefinite dell'utente.

Sto utilizzando Mac OS X 10.6.2 e XCode 3.2.1

+0

Assicurarsi che le caselle di controllo sono tenuti a "Shared opzioni predefinite dell'utente Controller", chiave di controllo "valori", modello di percorsi chiave "fooKey"/"Barkey". Altrimenti il ​​tuo codice mi starà bene. – Costique

+5

'@" NO "' non è un valore booleano; è una stringa letterale per la parola "NO". Si dovrebbe usare '[NSNumber numberWithBool: NO]'; in caso contrario, i valori nelle impostazioni predefinite dell'utente non saranno Booleans. –

+0

No, non lo saranno, ma se li leggo come BOOL - lo faranno. Estratto dal libro di Daniel H Steinberg "Cocoa Programming" (pragprog.com): In realtà, non è necessario essere così espliciti quando si inserisce BOOL nel dizionario. È possibile passare il valore YES o NO come stringa e creare ancora un valore BOOL da questo valore quando si leggono le preferenze. – Eimantas

risposta

75

Dalla documentazione per -registerDefaults: (enfasi aggiunta):

Il contenuto del dominio registrazione non vengono scritti su disco ; è necessario chiamare questo metodo ogni volta che l'applicazione inizia. È possibile inserire un file plist nella directory delle risorse dell'applicazione e chiamare registerDefaults: con i contenuti letti da quel file.

Quindi il codice era sulla strada giusta. Ecco come si registrano i valori predefiniti di default.

Io di solito uso questo -applicationDidFinishLaunching::

// Load default defaults 
[[NSUserDefaults standardUserDefaults] registerDefaults:[NSDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Defaults" ofType:@"plist"]]]; 

Utilizzando un plist rende facile aggiungere e modificare le impostazioni predefinite nella vostra app, e ti impedisce di fare l'errore di usare @"NO" come un valore troppo.

Edit: Swift 3 variante:

UserDefaults.standard.register(defaults: NSDictionary(contentsOf: Bundle.main.url(forResource: "Defaults", withExtension: "plist")!)! as! [String : Any]) 
+0

Johan - grazie per l'apertura degli occhi. Ho ricontrollato la chiamata e sembra che funzioni senza istruzioni if! – Eimantas

+0

È possibile utilizzare il codice "caricamento predefinito predefinito" sopra con il pacchetto Impostazioni? Ad esempio, potrei usare il file Root.plist per inizializzare i miei valori predefiniti? – Ricky

+0

Sì, anche se il pacchetto Impostazioni può essere caricato prima che l'app sia stata mai avviata, è comunque possibile che si desideri impostare anche i valori di default iniziali nelle impostazioni plist. Il metodo '-registerDefaults:' non sovrascriverà le preferenze impostate tramite un pacchetto Impostazioni. –