2015-04-21 1 views
1

J'ai quelques CGPoint s que j'ai besoin de stocker dans un NSDictionary puis écrire dans un fichier. Plus tard, je dois être en mesure de charger le fichier dans un NSDictionary et accéder au CGPoint à l'intérieur.Comment stocker des objets dans plist

self.dict est le NSDictionary Je veux stocker points.

- (void)setPoint:(CGPoint)point forKey:(NSString *)key { 
    NSValue *value = [NSValue valueWithCGPoint:point]; 
    [self.dict setValue:value forKey:key]; 
} 

Je veux aussi les informations à chiffrer. Donc, je convertis le NSDictionary en NSData pour le crypter.

- (void)encryptDictionaryWithKey:(NSData *)key writeToFile:(NSString *)file { 
    NSData *encryptedDict = [[NSKeyedArchiver archivedDataWithRootObject:self] encryptWithKey:key]; 
    [encryptedDict writeToFile:file atomically:YES]; 
} 

ensuite pour obtenir les informations à partir du fichier, le déchiffrer, et le mettre dans NSDictionary forme:

+ (NSDictionary *)dictionaryWithContentsOfEncryptedData:(NSData *)data  decryptWithKey:(NSData *)key { 
    NSData *decryptedData = [data decryptedWithKey:key]; 
    return (NSDictionary *)[NSKeyedUnarchiver unarchiveObjectWithData:decryptedData]; 
} 

je peux mettre d'autres valeurs (comme NSNumber) dans le NSDictionary, chiffrez et écrivez-le dans un fichier, puis récupérez-le à partir du fichier et décryptez-le ... et la valeur est toujours intacte. Donc mon code semble aller bien. Mais cela ne fonctionnera pas avec NSValue.

Je l'utilise pour obtenir CGPoint de NSValue. À ce stade, self.plist peut avoir été (mais pas nécessairement) chiffré, écrit dans un fichier, puis défini sur une version non cryptée du fichier.

- (CGPoint)pointForKey:(NSString *)key { 
    NSValue *value = [self.prefs objectForKey:key]; 
    return [value CGPointValue]; 
} 

Ce code renvoie uniquement 0,0 (et value == nil) si self.plist a été chiffré, écrit dans le fichier, puis chargé à partir du fichier et non crypté.

Le NSValue avec CGPoint semble être défini sur nil pendant le processus d'écriture dans le fichier. Je n'ai aucune idée de ce que j'ai fait de mal, donc toute aide est appréciée. Merci!

Répondre

0

Vous pouvez convertir le CGPoint en objet pouvant être stocké dans un plist. Par exemple, le CGPointCreateDictionaryRepresentation() function convertira un CGPoint en NSDictionary (ou plutôt un CFDictionaryRef pouvant être converti en NSDictionary). Vous pouvez stocker cela dans le plist, puis le convertir retour en CGPoint en utilisant la fonction compagnon CGPointMakeWithDictionaryRepresentation() lorsque vous chargez le plist.