2010-01-16 14 views
33

Mam klasę AppDelegate z metodą +(void)initialize, której używam do rejestrowania niektórych wartości domyślnych. Oto kod, który używam:Jak zarejestrować domyślne ustawienia użytkownika za pomocą NSUserDefaults bez nadpisywania istniejących wartości?

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

    [[NSUserDefaults standardUserDefaults] registerDefaults:defaults]; 
} 

ja również stworzony Preferences.xib który posiada kilka pól wyboru (NSButton), że stan wyświetlacza preferencji. Są one powiązane z NSUserDefaultsController tymi samymi kluczami (w tym przypadku klucz fooKey i barKey). Za każdym razem, gdy uruchamiam aplikację i zmieniam "domyślne ustawienia", są one przywracane przy następnym uruchomieniu aplikacji.

Czy istnieje sposób zarejestrowania "domyślnych wartości domyślnych" bez nadpisywania istniejących wartości? Może za każdym razem, gdy buduję i uruchamiam aplikację, jej plik preferencji jest odtwarzany? Może powinienem odłączyć pola wyboru od NSUserDefaultsController i zachować wartości kluczy osobiście za pomocą niestandardowego kodu w oknie kontrolnym preferencji?

Chciałbym usłyszeć waszą implementację wyboru dla utrzymania domyślnych ustawień użytkownika.

Używam Mac OS X 10.6.2 i XCode 3.2.1

+0

Upewnij się, że pola wyboru są zobowiązane do "Wspólna domyślne obsługi kontrolera", klucz kontrolera "wartości", model kluczowych ścieżek "fooKey"/"Barkey". W przeciwnym razie twój kod wygląda dla mnie dobrze. – Costique

+5

'@" NIE "' nie jest literałem boolowskim; jest literałem napisowym dla słowa "NIE". Powinieneś użyć '[NSNumber numberWithBool: NO]'; w przeciwnym razie wartości w domyślnych ustawieniach użytkownika nie będą wartościami logicznymi. –

+0

Nie, nie będą, ale jeśli przeczytam je jako BOOL - będą. Fragment książki Daniela H Steinberga "Cocoa Programming" (pragprog.com): Właściwie nie musisz być tak jednoznaczny, gdy umieścisz BOOL w słowniku. Możesz przekazać wartość TAK lub NIE jako ciąg i nadal tworzyć BOOL z tej wartości, gdy czytasz z preferencji. – Eimantas

Odpowiedz

75

Z dokumentacji dla -registerDefaults: (podkreślenie dodane):

zawartości Rejestracja domen nie są zapisywane na dysku ; tę metodę należy wywołać za każdym razem, gdy aplikacja zaczyna się. Możesz umieścić plik plist w katalogu zasobów aplikacji i wywołać registerDefaults: z zawartością, którą czytasz z tego pliku.

Twój kod był na dobrej drodze. W ten sposób rejestrujesz domyślne wartości domyślne.

Zwykle używam tego w -applicationDidFinishLaunching::

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

Korzystanie z plist ułatwia dodawanie i zmienić domyślne ustawienia w aplikacji, a to uniemożliwia dokonywania błąd używając @"NO" jako wartość zbyt.

Edit: Swift 3 wariant:

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

Johan - dzięki za otwieracz oczu. Sprawdziłem połączenie i wygląda na to, że działa bez żadnych instrukcji if! – Eimantas

+0

Czy powyższy kod "Domyślne wartości domyślne obciążenia" może być używany z pakietem ustawień? Na przykład, czy mogę użyć pliku Root.plist do zainicjowania moich wartości domyślnych? – Ricky

+0

Tak, chociaż pakiet ustawień może zostać załadowany przed uruchomieniem aplikacji, więc nadal możesz chcieć ustawić początkowe ustawienia domyślne również w ustawieniach plist. Metoda '-registerDefaults:' nie zastąpi preferencji ustawionych za pomocą pakietu ustawień. –

Powiązane problemy