2011-02-08 24 views

Odpowiedz

81

Różnica polega na tym, że pierwszy kod-snippet zarejestrować domyślne, które będą stosowane, gdy użytkownik nie ma żadnych zmian własność".

Jeśli więc chcesz podać "właściwość" z nazwą klucza "Wiadomość powitalna", możesz zamiast zwracać właściwość o wartości zero wstawić domyślną wiadomość "Witamy pierwszego użytkownika", która zostanie wyświetlona, ​​gdy nie wprowadzono żadnych zmian w nieruchomości.

Spowoduje to uproszczenie logiki, ponieważ nie trzeba pisać testu if, aby sprawdzić, czy "właściwość" zwraca zero, a następnie w razie potrzeby utworzyć kolejną wiadomość.

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

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

Drugi zaksięgowany fragment kodu służy do ustawiania właściwości na inną wartość. Będziesz miał różne metody ustawiania (setString, setObject, setBoolean) do ustawiania wartości w zależności od stanu twojego programu w Userdefaults.

EDYCJA ----- Aktualizuje zgodnie z życzeniem w komentarzu.

Pierwsza metoda służy do rejestrowania wartości domyślnych, jak sama nazwa wskazuje. Przy pierwszym dostępie do właściwości o pewnej nazwie kluczowej wartość będzie zerowa dla obiektów, fałsz dla wartości logicznych lub 0 dla liczb. Zamiast wykonywać wiele testów i tak dalej, jeśli wartości nie są ustawione w programie, a następnie wykonać coś "domyślnego", takiego jak powyższy przykład, można wysłać aplikację z pewnymi wcześniej zdefiniowanymi wartościami dla tych kluczy.

Typowym miejscem do umieszczenia registerDefaults jest metoda initializer w appDelegate.

Potem gdzieś w programie możesz ustawić wartości tych pól, a następnie użyć setObject, setString, setBoolean ... i za zdobycie użyć stringForKey, objectForKey ...

myśleć o tym jako że ten RegisterDefaults jest konstruktorem, w którym możesz dostarczyć wartości sensowne dla obiektu, w przeciwnym razie otrzymasz pewne wartości domyślne, które już napisałem. Później, jeśli chcesz zmienić atrybuty obiektu, NIE używaj "konstruktora", ale metody set/get.

+0

Hmmm Wciąż nie bardzo rozumiem.Masz na myśli, że mogę ustawić właściwość @ "something" na anObject za pomocą jednego z fragmentów kodu, ale tylko ten pierwszy sprawdzi, czy już mam zapisaną wcześniej wartość, czy to prawda? Jeśli mam coś napisanego wcześniej, to nie przepisuję wartości, czy to prawda? –

+0

Zaktualizowana odpowiedź. – LuckyLuke

+1

Dzięki za zaktualizowaną odpowiedź! Tylko jedna mała rzecz ... Jeśli wstawię registerDefault do AppDelegate, czy to oznacza, że ​​nie będzie on wywoływany więcej niż raz? Na przykład mój fragment kodu, to ustawi @ tylko raz "coś" dla anObject, prawda? Mimo że kod jest uruchamiany w AppDelegate za każdym razem, gdy uruchamiam aplikację? –

10

Innym sposobem patrzenia na to jest to. Jeśli usuniesz plik preferencji z ~/Library/Preferences, wartości domyślne ustawione przez registerDefaults będą ustawione domyślnie dla aplikacji, dopóki nie zostaną ustawione nowe preferencje.

30

Krótko mówiąc,

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

uratuje "Entropy" do pliku o nazwie com.example.Demo.plist w folderze/Library (Preferencje gdzie com.example.Demo to Bundle ID zobacz 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"]); 

wypisze "Mac OS X", "Google" (null)

W rzeczywistości registerDefaults

  • nie zapisuje na dysku
  • ustawia tylko wartość dla kluczy, które nie zostały ustawione ("kOS" jest ustawione przez setObject:forKey: i "kSearchEngine" nie jest ustawiona)
  • zwraca 0 dla wartości skalarnych Nil dla obiektów jeśli klucz nie jest ustawiona zarówno registerDefaults i setObject:forKey: („kBrowser” w tym przypadku)

I wykorzystanie registerDefaults

Cytowany od Preferences and Settings Programming Guide

Jeśli te standardowe wartości domyślne nie są odpowiednie dla aplikacji, można zarejestrować swoją defau Wartości są określane przy użyciu metody registerDefaults: . Ta metoda umieszcza niestandardowe wartości domyślne w domenie NSRegistrationDomain, co powoduje ich zwrócenie, gdy preferencja nie jest jawnie ustawiona.

Cytat z How to Save Data with NSUserDefaults

Kolejna wskazówka jest, że można zainicjować swoje NSUserDefaults z zdefiniowanym NSDictionary obiektu. Na przykład można ustawić domyślną wartość na "false" lub "true", zanim użytkownik kiedykolwiek uzyskał możliwość interakcji z programem. W moim przypadku czasami tworzę tablicę, która reprezentuje wszystkie poziomy w mojej grze, aw każdej z wartości przechowuję wartość boolowską, aby sprawdzić, czy gracz ukończył poziom. Aby to zrobić, tworzę obiekt danych, a następnie rejestruję go przy pomocy NSUserDefaults. Jeśli dla obiektu istnieje poprzednia wartość, nic się nie dzieje. Inaczej mój pusty obiekt zostanie zapisany jako „default” domyślne

PS: Ole ma bardzo dobry artykuł wyjaśniający Handling Default Values With NSUserDefaults szczegółowo

+3

Prostsza odpowiedź niż zaakceptowana. – Martin

3

w Swift 2.1.1 Xcode 7.2

I dodanej ten fragment do aplikacji: didFinishLaunchingWithOpcje do inicjalizacji tintColorsIndex, który jest jednym z parametrów użytkownika, można zmienić w aplikacji.

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

Gdy aplikacja zostanie uruchomiona po raz pierwszy, tintColorsIndex otrzyma wartość -1 (wartość Int). Jeśli użytkownik zmieni kolor podczas korzystania z aplikacji, ich preferencje nie zostaną zastąpione podczas kolejnych uruchomień.

Powiązane problemy