2010-01-16 12 views
33

Ich habe eine AppDelegate-Klasse mit +(void)initialize Methode, die ich verwende, um einige Standardwerte zu registrieren. Hier ist der Code, den ich benutze:Wie Benutzerstandards mit NSUserDefaults registrieren, ohne bestehende Werte zu überschreiben?

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

    [[NSUserDefaults standardUserDefaults] registerDefaults:defaults]; 
} 

ich auch Preferences.xib geschaffen, das Paar von Kontrollkästchen hält (NSButton), dass der Anzeigestatus von Präferenzen. Sie sind an NSUserDefaultsController mit denselben Schlüsseln gebunden (fooKey und barKey in diesem Fall). Jedes Mal, wenn ich eine App starte und die "Standardeinstellungen" ändere, werden sie beim nächsten Start der App wiederhergestellt.

Gibt es eine Möglichkeit, "Standardeinstellungen" zu registrieren, ohne bereits vorhandene Werte zu überschreiben? Vielleicht wird jedes Mal, wenn ich eine App erstelle und starte, die Voreinstellungsdatei neu erstellt? Vielleicht sollte ich Kontrollkästchen von NSUserDefaultsController lösen und die Werte der Schlüssel selbst mit einigen benutzerdefinierten Code im Einstellungsfenster Controller beibehalten?

Ich würde gerne Ihre Implementierung der Wahl für die Benutzereinstellungen zu hören.

Ich verwende Mac OS X 10.6.2 und XCode 3.2.1

+0

Stellen die Kontrollkästchen sicher sind verpflichtet, auf "Shared Benutzervorgaben Controller", Steuertaste "Werte", Modell Schlüsselpfade "fooKey"/"Barkey". Sonst sieht dein Code gut für mich aus. – Costique

+5

'@" NO "' ist kein Boolesches Literal; Es ist ein String-Literal für das Wort "NEIN". Sie sollten '[NSNumber numberWithBool: NO]' verwenden; Andernfalls sind die Werte in den Benutzerstandardwerten nicht Boolesch. –

+0

Nein, werden sie nicht sein, aber wenn ich sie als BOOLs lese - werden sie. Auszug aus Daniel H. Steinbergs Buch "Cocoa Programming" (pragprog.com): Eigentlich müssen Sie nicht so explizit sein, wenn Sie das BOOL in das Wörterbuch stellen. Sie könnten den Wert YES oder NO als String übergeben und trotzdem einen BOOL von diesem Wert erstellen, wenn Sie von den Einstellungen lesen. – Eimantas

Antwort

75

Aus der Dokumentation für -registerDefaults: (Hervorhebung hinzugefügt):

Der Inhalt der Registrierungsdomäne sind nicht auf die Festplatte geschrieben ; Sie müssen diese Methode jedes Mal aufrufen, wenn Ihre Anwendung startet. Sie können eine PLIST-Datei in das Ressourcenverzeichnis der Anwendung einfügen und registerDefaults aufrufen: mit den Inhalten, die Sie aus dieser Datei eingelesen haben.

Ihr Code war also auf dem richtigen Weg. So registrieren Sie Standardeinstellungen.

Ich benutze diese in der Regel in -applicationDidFinishLaunching::

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

eine plist macht es leicht, Standardwerte in Ihrer App hinzuzufügen und zu ändern, und es verhindert, dass Sie machen den Fehler, zu @"NO" als Wert verwendet wird.

Edit: Swift 3 Variante:

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

Johan - danke für den Augenöffner. Ich habe den Anruf erneut überprüft und es scheint, dass es ohne if-Anweisungen funktioniert! – Eimantas

+0

Kann der obige Code "Standardwerte laden" mit dem Paket "Einstellungen" verwendet werden? Kann ich beispielsweise die Datei Root.plist zum Initialisieren meiner Standardeinstellungen verwenden? – Ricky

+0

Ja, obwohl Ihr Settings-Paket möglicherweise geladen wurde, bevor Sie die App gestartet haben, sodass Sie die ersten Standardeinstellungen auch in den Einstellungen beibehalten möchten. Die Methode '-registerDefaults:' überschreibt nicht die Einstellungen, die über ein Settings-Paket festgelegt wurden. –