6

辞書が保存されてNSUserDefaultsおり、この辞書に項目を追加/削除する必要があります。

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

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

また、階層内のより深いオブジェクトのコピーと再設定がさらに必要になります。

より良い方法はありますか?

使用しようとしまし[defaults setValue:… forKeyPath:@"foo.bar"]たが、うまくいかないようです (オブジェクトは可変ではありません)。

4

1 に答える 1

5

私は通常、すべてのアプリケーション設定を保持するカスタム クラスを作成します。そのクラスは、プログラムの開始時に userDefaults の変更可能なコピーを 1 回ロードし、途中ですべての増分保存を処理できます。

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]ます。プログラムの実行中に変更された設定は、 を使用して変更し、必要に応じmyPrefsて呼び出して保存できます。[myPrefs save]

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

追加のボーナスとして、MyPreferencesクラスを好きなように構成できるため、OO プログラミングの利点を設定全体にもたらすことができます。ここでは変更可能なディクショナリを使用する簡単な方法を示しましたが、各設定をプロパティにしてNSColor、たとえば のようなより複雑なオブジェクトの前処理と後処理を行うことができます。

于 2009-08-14T14:08:17.550 に答える