2010-09-06 11 views

Respuesta

1

Objetos personalizados, no. NSUserDefaults solo conoce unos pocos tipos básicos (NSData, NSString, NSNumber, NSDate, NSArray o NSDictionary).

¿Podría usar JSON (http://code.google.com/p/json-framework/) para convertir su objeto personalizado a una representación de cadena, y luego guardar una matriz de esos en Predeterminados? (Usando el método setObject: forKey:)

De lo contrario, podría utilizar el uso de sqlite, NSCoder, o incluso recurrir a fopen.

+0

Aunque estoy usando objetos personalizados, se almacenan en NSArray, que es lo que intento guardar. ¿No debería funcionar entonces? –

+0

Si por "¿No debería funcionar?" quieres decir "¿No puedo almacenar objetos personalizados en un NSArray?" la respuesta es sí. Si quieres decir "¿No puedo almacenar la matriz de objetos personalizados en NSUserDefaults?" entonces la respuesta es no, porque NSUserDefaults no puede almacenar objetos arbitrarios. – Chuck

+0

ugh! JSON? Cuando hay un protocolo NSCoder perfectamente bueno? – Abizern

7

NSUserDefaults no puede escribir objetos personalizados para presentar, únicos que dispone de información (NSArray, NSDictionary, NSString, NSData, NSNumber y NSDate). En su lugar, debería echar un vistazo al Archives and Serializations Programming Guide, así como también al NSCoding Protocol Reference, si está buscando guardar y restaurar objetos personalizados en el disco. Implementar el protocolo no es terriblemente difícil y requiere muy poco trabajo.

26

Todavía puede usar NSUserDefaults si archiva su matriz en NSData.

para el archivo de la matriz, puede utilizar el siguiente código:

[[NSUserDefaults standardUserDefaults] setObject:[NSKeyedArchiver archivedDataWithRootObject:myArray] forKey:@"mySavedArray"]; 

Y a continuación, para cargar los objetos personalizados en la matriz se puede utilizar este código:

NSUserDefaults *currentDefaults = [NSUserDefaults standardUserDefaults]; 
NSData *savedArray = [currentDefaults objectForKey:@"mySavedArray"]; 
if (savedArray != nil) 
{ 
     NSArray *oldArray = [NSKeyedUnarchiver unarchiveObjectWithData:savedArray]; 
     if (oldArray != nil) { 
       customObjectArray = [[NSMutableArray alloc] initWithArray:oldArray]; 
     } else { 
       customObjectArray = [[NSMutableArray alloc] init]; 
     } 
} 

Asegúrese de verificar que los datos devueltos por los valores predeterminados del usuario no son nil, ya que pueden bloquear su aplicación.

La otra cosa que tendrá que hacer es hacer que su objeto personalizado cumpla con el protocolo NSCoder. Puede hacer esto usando los métodos -(void)encodeWithCoder:(NSCoder *)coder y -(id)initWithCoder:(NSCoder *)coder.


EDIT.

Aquí hay un ejemplo de lo que podría poner en los métodos -(void)encodeWithCoder:(NSCoder *)coder y -(id)initWithCoder:(NSCoder *)coder.

- (void)encodeWithCoder:(NSCoder *)coder; 
{ 
    [coder encodeObject:aLabel forKey:@"label"]; 
    [coder encodeInteger:aNumberID forKey:@"numberID"]; 
} 

- (id)initWithCoder:(NSCoder *)coder; 
{ 
    self = [[CustomObject alloc] init]; 
    if (self != nil) 
    { 
     aLabel = [coder decodeObjectForKey:@"label"]; 
     aNumberID = [coder decodeIntegerForKey:@"numberID"]; 
    } 
    return self; 
} 
+0

¿Tengo que agregar esas definiciones de método o tengo que poner código en esos métodos? –

+0

He editado mi publicación con un ejemplo de lo que tendrá que poner en esos métodos. – Joshua

+0

Trabaja como un encanto. Gracias. – jeswang

Cuestiones relacionadas