2012-02-29 12 views
7

Ho un oggetto nella radice di plist che memorizza oggetti e chiavi (uno dei quali è immesso da un campo di testo utente). Non ho problemi a scrivere e creare strutture; sta cercando di leggere i valori che causano problemi. Sotto il codice che ho usato per scrivere i dati, qualcuno può dirmi come leggere la stringa [val] e [myKey]?Come leggere la stringa da NSUserDefaults

grazie!

#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]; 

vorrei per popolare automaticamente il campo di testo con il [val], per [myKey], se l'utente ha l'informazioni già in plist. Ecco il codice che sto cercando di utilizzare per questo:

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

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

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

Questo codice viene effettivamente compilato? – sch

+0

heh. sì, lo fa senza problemi, non deve essere così male, giusto? :-p – Devon

+0

Non è un'app per iOS, è OS X. – Devon

risposta

30

È possibile scrivere il valore in NSUserDefault come il seguente:

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

E leggere in un secondo momento come il seguente:

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

in modo da poter semplificare il codice in:

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

E quando è possibile recuperare quel valore semplicemente chiamando:

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

Cool, grazie per averlo cambiato ;-) - ci proverò ora. – Devon

+0

Non mi piace il .text - Ottengo un errore "Proprietà" testo "non trovato su oggetto di tipo NSTextField * ' – Devon

+0

Sì, l'ho cambiato in' setStringValue'quando si è detto che non era un'app iOS :) – sch

2

Se ho capito bene, si dovrebbe essere in grado di fare ciò che è necessario semplicemente facendo:

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

NSUserDefaults Reference Page

+0

Emette il valore predefinito "Nome" nel campo di testo che ho definito sopra, tuttavia, se la persona ha precedentemente inserito il proprio nome, dovrebbe leggerlo e compilare il campo di testo con tali informazioni. Sfortunatamente esce sempre "Your Name", quindi ovviamente non viene letto correttamente, perché il nome è memorizzato nel plist. – Devon

+0

È altamente improbabile che sia letto in modo errato poiché è una funzione direttamente dal framework. È molto più probabile che lo si stia impostando in modo errato. È difficile dirlo perché il codice che hai postato non è ovviamente l'intero codice, ma non è nemmeno compilabile. La mia ipotesi è che in realtà si sta impostando il valore due volte - prima con [default setObject ...] e poi registrando il dizionario. Dovresti farlo solo una volta. –

+0

Spiacente, ho pubblicato l'intero codice se questo aiuta. grazie! – Devon

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