2010-06-08 12 views
16

Si j'ai une personne de classe personnalisée qui a trois variables (qui sont propertized et synthétisés):Meilleur moyen d'enregistrer nsuserdefaults pour une classe personnalisée?

NSString* theName; 
float* theHeight; 
int theAge; 

instances de personne sont stockés dans « Groupe » NSArray. Il n'y a qu'un seul groupe. Quel est le meilleur moyen de stocker et de charger le groupe dans NSUserDefaults? (en gardant à l'esprit que float et int ne sont pas légaux pour NSUserDefaults)

+2

Pourquoi aren » t float et int légal? 'NSUserDefaults' a des méthodes pour les deux. –

+0

Avez-vous résolu votre problème? Veuillez marquer la bonne réponse pour marquer ce post comme étant répondu. –

Répondre

45

@Brad La réponse de Smith n'est pas complète, et est même incorrecte dans un certain sens. Nous devons utiliser NSKeyedArchiver et NSKeyedUnarchiver comme suit:

Faites votre classe (par exemple dans ce cas Person) afin de se conformer au protocole NSCoding et mettre en œuvre les méthodes que:

- (id)initWithCoder:(NSCoder *)decoder { 
    self = [super init]; 
    if(self) { 
     self.name = [decoder decodeObjectForKey:<key_for_property_name>]; 
     // as height is a pointer 
     *self.height = [decoder decodeFloatForKey:<key_for_property_height>]; 
     self.age = [decoder decodeIntForKey:<key_for_property_age>]; 
    } 
    return self; 
} 

- (void)encodeWithCoder:(NSCoder *)encoder { 
    [encoder encodeObject:self.name forKey:<key_for_property_name>]; 
    //as height is a pointer 
    [encoder encodeFloat:*self.height forKey:<key_for_property_height>] 
    [encoder encodeInt:self.age forKey:<key_for_property_age>]; 
} 

En utilisant NSUserDefaults

// Write to NSUserDefaults 
NSData *archivedObject = [NSKeyedArchiver archivedDataWithRootObject:<your_class_object>]; 
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
[defaults setObject:archivedObject forKey:<key_for_archived_object>]; 
[defaults synchronize]; 

// Read from NSUserDefaults 
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
NSData *archivedObject = [defaults objectForKey:<key_for_archived_object>]; 
<your_class> *obj = (<your_class> *)[NSKeyedUnarchiver unarchiveObjectWithData:archivedObject]; 
+3

Je souhaite que je puisse remettre votre réponse au sommet. Brad Smith est totalement trompeur. –

+2

Alors votez @BredSmith comme je l'ai fait – Dejell

+0

@Kailash, alors à quoi servent les méthodes de codage et de décodage? Quel codeur devrais-je transmettre lors de l'instanciation? Ou est-ce automatiquement appelé lors de la sauvegarde et de la lecture? – gdubs

1

Je trouve implémentant encodeWithCoder et initWithCoder assez ennuyeux, surtout si vous avez beaucoup d'attributs dans votre classe, et de nombreuses classes à enregistrer dans NSUserDefaults.

Je crée une bibliothèque RMMapper (https://github.com/roomorama/RMMapper) pour aider à enregistrer l'objet personnalisé dans NSUserDefaults plus facile et plus pratique.

Pour marquer une classe comme archivables, il suffit d'utiliser: #import "NSObject+RMArchivable.h"

Pour enregistrer un objet personnalisé dans NSUserDefaults:

#import "NSUserDefaults+RMSaveCustomObject.h" 

NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults]; 
[defaults rm_setCustomObject:user forKey:@"SAVED_DATA"]; 

Pour obtenir obj personnalisé à partir NSUserDefaults:

user = [defaults rm_customObjectForKey:@"SAVED_DATA"];