2009-08-14 15 views
6

辞書がNSUserDefaultsに保存されています。この辞書に項目を追加/削除する必要があります。コピーを作成せずにNSUserDefaultsのオブジェクトを変更する

これを行うには、辞書全体の変更可能なコピーを作成し、1つの要素を変更し、辞書全体を新しいコピーに置き換える必要があります。

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

であり、階層のさらに深いオブジェクトに対しては、さらに多くのコピーと再設定が必要です。

良い方法がありますか?

私は[defaults setValue:… forKeyPath:@"foo.bar"]を使用しようとしましたが、動作しないようです(オブジェクトは変更できません)。

答えて

5

私は通常、すべてのアプリケーション設定を保持するカスタムクラスを作成します。そのクラスは、プログラムの起動時に、一度userDefaultsの変更可能なコピーをロードし、その後、増分のすべてが道に沿って保存し処理することができます:

MyPreferences.h

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

MyPreferences.m

@implementation MyPreferences 
@synthesize allPrefs; 

- (id)init 
{ 
    if ((self = [super init]) == nil) { return nil; } 
    allPrefs = [[NSMutableDictionary alloc] initWithCapacity:0]; 
    return self; 
} 

- (void)dealloc 
{ 
    [allPrefs release]; 
    [super dealloc]; 
} 

- (void)load 
{ 
    // load all mutable copies here 
    [allPrefs setObject:[[defaults objectForKey:@"foo"] mutableCopy] 
       forKey:@"foo"]; 
    // ... 
} 

- (void)save 
{ 
    [defaults setObject:allPrefs forKey:@"app_preferences"]; 
} 

@end 

私はこのクラスのインスタンスをアプリケーションデリゲートに作成し、アプリケーションの起動時に[myPrefs load]を呼び出します。追加ボーナスとして

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

、あなたはの利点をもたらし、MyPreferencesクラスにあなたが好きなように構造化することができます。プログラムの実行中に任意の好みはmyPrefsを介して変更した後、必要に応じて[myPrefs save]を呼び出すことによって保存することができます変更しましたOOプログラミングをプリファレンス全体のセットに適用する。ここでは簡単な方法を示しましたが、単純に変更可能な辞書を使用していましたが、それぞれのプリファレンスをプロパティにして、より複雑なオブジェクトのプリ/ポスト処理をNSColorなどに行うことができます。

関連する問題