2012-02-29 13 views
7

Mam obiekt w katalogu głównym plist, który przechowuje obiekty i klucze (z których jeden jest wprowadzany z pola tekstowego użytkownika). Nie mam problemu z pisaniem i tworzeniem struktury; próbuje odczytać wartości, które powodują problem. Poniżej kodu zapisałem dane, czy ktoś może mi powiedzieć, jak czytać ciąg [val] i [myKey]?Jak odczytać ciąg z NSUserDefaults

dziękuję!

#define defaultValue @"Your Name" 
#define myKey @"PersonName" 

- (void)textFieldAction:(id)sender { 

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
    NSString *val; 

    // Get the new value from the textfield 

    val = [myTextField stringValue]; 

    if ([val isEqualToString:defaultValue]) { 
     [defaults removeObjectForKey:myKey]; 
    } else { 
     // [defaults setObject:val forKey:myKey]; 

    NSDictionary *my_dict = [NSDictionary dictionaryWithObjectsAndKeys: 
          @"Name", @"PersonName", 
          @"Email", @"PersonEmail", 
          @"Dept", @"PersonDept", 
          @"Job", @"PersonJob", 
          val, myKey, 
          @"Status", @"PersonStatus", 
          nil]; 

    [defaults setObject: my_dict forKey: @"Person"]; 

    [[NSUserDefaults standardUserDefaults] registerDefaults:my_dict]; 

Chciałbym aby automatycznie wypełnić pole tekstowe z [val] na [MyKey], jeśli użytkownik posiada już informacje w plist. Oto kod próbuję użyć do tego:

- (void)applicationDidFinishLaunching:(NSNotification *)notification { 

    NSUserDefaults *defaults = [[NSUserDefaults standardUserDefaults] objectForKey:myKey]; 
    NSString *val = [defaults stringForKey:myKey]; 

    if (val == nil) val = defaultValue; 
    [myTextField setStringValue:val]; 
+0

Czy ten kod faktycznie się kompiluje? – sch

+0

heh. Tak, nie ma problemów, nie może być tak źle, prawda? :-p – Devon

+0

To nie jest aplikacja na iOS, to OS X. – Devon

Odpowiedz

30

Możesz zapisać wartość na NSUserDefault, jak poniżej:

[[NSUserDefaults standardUserDefaults] setValue:[myTextField stringValue] forKey:@"Person"]; 

i przeczytaj go później tak:

[myTextField setStringValue:[[NSUserDefaults standardUserDefaults] stringForKey:@"Person"]; 

Więc można uprościć kod do:

- (void)textFieldAction:(id)sender { 
    [[NSUserDefaults standardUserDefaults] setValue:[myTextField stringValue] forKey:@"Person"]; 
    [[NSUserDefaults standardUserDefaults] synchronize]; 
} 

i kiedy można odzyskać tę wartość po prostu dzwoniąc:

- (void)applicationDidFinishLaunching:(NSNotification *)notification 
{ 
    // ... 
    NSString *value = [[NSUserDefaults standardUserDefaults] stringForKey:@"Person"]; 
    if (value == nil) value = defaultValue; 
    [myTextField setStringValue:value]; 
    // ... 
} 
+0

Fajnie, dziękuję za zmianę ;-) - spróbuję teraz. – Devon

+0

Nie podoba mi się .text - pojawia się błąd "Tekst właściwości" nie został znaleziony na obiekcie typu NSTextField * ' – Devon

+0

Tak, zmieniłem to na 'setStringValue' kiedy powiedziałeś, że to nie aplikacja na iOS :) – sch

2

Jeśli dobrze rozumiem, powinieneś być w stanie zrobić to, co trzeba, po prostu robi:

NSString * val = [[NSUserDefaults standardUserDefaults] objectForKey: myKey]; 
[textfield setText: val]; 

NSUserDefaults Reference Page

+0

Wysyła wartość defaultValue "Twoje imię" w polu tekstowym, które zdefiniowałem powyżej, jednak jeśli osoba podała wcześniej jego nazwę, powinna ją przeczytać i wypełnić pole tekstowe tymi informacjami. Niestety zawsze wyświetla "Twoje imię", więc oczywiście nie jest poprawnie odczytane, ponieważ nazwa jest przechowywana w pliku plist. – Devon

+0

Jest wysoce nieprawdopodobne, aby został odczytany niepoprawnie, ponieważ jest to funkcja bezpośrednio z frameworka. Jest o wiele bardziej prawdopodobne, że ustawisz go niepoprawnie. Trudno powiedzieć, ponieważ napisany przez Ciebie kod to oczywiście nie cały kod - nawet go nie skompilował. Domyślam się, że faktycznie ustawiasz wartość dwukrotnie - najpierw przez [domyślnie setObject ...], a następnie rejestrując słownik. Powinieneś zrobić to tylko raz. –

+0

Przepraszamy, opublikowałem cały kod, jeśli to pomaga. Dziękuję Ci! – Devon

1
myTextField.text = [[NSUSerDefaults standardUserDefaults] objectForKey:myKey];