2009-08-14 3 views
6

J'ai un dictionnaire stocké dans NSUserDefaults et j'ai besoin d'ajouter/supprimer des éléments dans ce dictionnaire.Modifier des objets dans NSUserDefaults sans créer et re-définir des copies

Cela me dérange que pour ce faire, je dois créer une copie mutable du dictionnaire entier, modifier un élément et remplacer le dictionnaire entier par une nouvelle copie.

copy = [[defaults objectForKey:@"foo"] mutableCopy]; 
[copy setObject:… forKey:@"bar"]; 
[defaults setObject:copy forKey:@"foo"]; 

et il implique encore plus de copie et de redéfinition pour les objets plus profonds dans la hiérarchie.

Y a-t-il un meilleur moyen?

J'ai essayé d'utiliser [defaults setValue:… forKeyPath:@"foo.bar"] mais cela ne semble pas fonctionner (l'objet n'est pas modifiable).

Répondre

5

Je crée généralement une classe personnalisée pour contenir toutes mes préférences d'applications. Cette classe peut charger des copies mutables des userDefaults une fois, lorsque le programme démarre, puis gérer tous les arrêts supplémentaires le long du chemin:

MyPreferences.h

@interface MyPreferences 
{ 
    NSMutableDictionary allPrefs; 
} 
@property (readonly) NSMutableDictionary * allPrefs; 
- (void)load; 
- (void)save; 
@end 

MyPreferences.m

Je crée une instance de cette classe dans mon délégué d'application, puis j'appelle [myPrefs load] lorsque mon application se lance. Toutes les préférences ont changé alors que le programme est en cours d'exécution peut être modifié par myPrefs, puis enregistré en appelant [myPrefs save] comme vous le souhaitez:

MyPreferences * myPrefs = [myApplication myPrefs]; 
[myPrefs setObject:bar forKeyPath:@"allPrefs.foo.bar"]; 
[myPrefs save]; 

En prime, vous pouvez structurer la classe MyPreferences comme vous le souhaitez, apporter les avantages de OO programmation à l'ensemble des préférences. J'ai montré la manière simple ici, utilisant simplement un dictionnaire mutable, mais vous pouvez faire chaque préférence dans une propriété, et faire le pré/post traitement pour les objets plus compliqués comme NSColor, par exemple.

Questions connexes