2010-06-29 4 views
2

J'écris une application qui utilise NSUserDefaults comme mécanisme de stockage de données, et je frappe un problème lorsque vous essayez d'enregistrer des données (qui est conforme aux protocoles Property List):NSUserDefaults ne sauvera pas NSDictionary

+ (BOOL)storeAlbum:(Album *)album 
{ 
    NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; 
    NSMutableDictionary *albums = (NSMutableDictionary *)[prefs objectForKey:@"my_adventure_book_albums"]; 
    NSLog(@"Existing albums: %@",albums); 
    if (!albums) 
     albums = [NSMutableDictionary dictionaryWithObject:album forKey:@"album"]; 
    else 
     [albums setObject:album forKey:@"album"]; 
    NSLog(@"%@",album); 
    [prefs setObject:albums forKey:@"my_adventure_book_albums"]; 
    return [prefs synchronize]; 
} 

Je reçois cette sortie:

2010-06-29 17:17:09.929 MyAdventureBook[39892:207] Existing albums: (null) 
2010-06-29 17:17:09.930 MyAdventureBook[39892:207] test 
2010-06-29 17:17:09.931 MyAdventureBook[39892:207] *** -[NSUserDefaults setObject:forKey:]: Attempt to insert non-property value '{ 
    album = test; 
}' of class 'NSCFDictionary'. 

La méthode de description de l'album ressemble à:

- (NSString *)description 
{ 
    // Convert to a NSDictionary for serializing 
    if (!title) title = @""; 
    if (!date) date = [NSDate dateWithTimeIntervalSinceNow:0]; 
    if (!coverImage) coverImage = @""; 
    if (!images) images = [[NSArray alloc] initWithObjects:@"",nil]; 

    //NSDictionary *dict = [NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:title,date,coverImage,images,nil] forKeys:[NSArray arrayWithObjects:@"title",@"date",@"coverImage",@"images",nil]]; 
    //NSDictionary *dict = [NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:title,nil] forKeys:[NSArray arrayWithObjects:@"title",nil]]; 
    //return [dict description]; 
    return @"test"; 
} 

A Toutes les lignes commentées ont le même résultat, alors j'ai juste décidé de voir si le "test" NSString fonctionnerait, ce qui n'est pas le cas (bien sûr).

Répondre

8

Mais l'objet que vous mettez dans le dictionnaire, un Album* n'est probablement pas un objet de liste de propriétés, n'est-ce pas? Chaque objet, tout en bas, doit être un objet de liste de propriétés pour que cela fonctionne. Une méthode description n'est pas assez bonne pour que cela se produise.

Pour contourner ce problème, vous pouvez utiliser NSCoding et un NSKeyedArchiver pour écrire votre dictionnaire à un NSData, que vous pouvez stocker dans les préférences.

4

NSUserDefaults renvoie toujours des objets non modifiables, vous ne pouvez donc pas les convertir en mutable. Ne [prefs objectForKey:@"my_adventure_book_albums"] mutableCopy] (et n'oubliez pas de le libérer lorsque vous avez terminé).

+0

Nope, même résultat: *** - [NSUserDefaults setObject: forKey:]: tentative d'insérer la valeur non-propriété « { album = test; } 'de la classe' NSCFDictionary '. –

5

Vous pouvez uniquement mettre des types de fondations de base dans une liste de propriétés. NSUserDefaults écrit les préférences comme une liste de propriétés. Voir ici pour property list types autorisés. En un mot, ce sont les nombres, les chaînes, les données, les dates, les tableaux et les dictionnaires de ceux-ci. Les dictionnaires doivent avoir des clés de chaîne.

Questions connexes