2012-02-29 11 views
7

Tengo un objeto en la raíz de plist que almacena objetos y claves (uno de los cuales es entrada de un campo de texto del usuario). No tengo problemas para escribir y crear estructura; está tratando de leer los valores que causan el problema. Debajo del código que solía escribir los datos, ¿alguien me puede decir cómo leer la cadena [val] y [myKey]?Cómo leer cadenas de NSUserDefaults

gracias!

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

me gustaría para rellenar automáticamente el campo de texto con el [val], de [myKey], si el usuario tiene la información ya en el plist. Aquí está el código que estoy tratando de utilizar para ello:

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

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

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

¿Compila realmente este código? – sch

+0

heh. sí, lo hace sin problemas, no debe ser tan malo, ¿verdad? :-p – Devon

+0

No es una aplicación de iOS, es OS X. – Devon

Respuesta

30

Puede escribir el valor en NSUserDefault como el siguiente:

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

Y leerlo más tarde como el siguiente:

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

Así se puede simplificar el código en:

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

y cuándo se puede recuperar ese valor mediante una llamada telefónica:

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

Genial, gracias por cambiarlo ;-) - Lo intentaré ahora. – Devon

+0

No me gusta el texto. Recibo un error "Propiedad 'texto' no encontrado en el objeto de tipo NSTextField * ' – Devon

+0

Sí, lo cambié a' setStringValue' cuando dijo que no era una aplicación de iOS :) – sch

2

Si he entendido bien, usted debería ser capaz de hacer lo que necesita simplemente haciendo:

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

NSUserDefaults Reference Page

+0

Muestra el Valor predeterminado "Tu nombre" en el campo de texto que he definido anteriormente, sin embargo, si la persona ha ingresado previamente su nombre, debe leerlo y rellenar el campo de texto con esa información. Desafortunadamente, siempre muestra "Your Name", por lo que obviamente no se lee correctamente, porque el nombre está almacenado en el plist. – Devon

+0

Es muy poco probable que se lea incorrectamente ya que es una función directamente del marco. Es mucho más probable que lo esté configurando incorrectamente. Es difícil de decir porque el código que publicaste obviamente no es todo el código, ni siquiera compilará. Supongo que en realidad está configurando el valor dos veces: primero por [default setObject ...] y luego registrando el diccionario. Solo deberías hacerlo una vez. –

+0

Lo siento, he publicado todo el código si eso ayuda. ¡gracias! – Devon

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