2009-08-14 28 views
6

我已將字典存儲在NSUserDefaults中,我需要添加/刪除此字典中的項目。在不創建和重新設置副本的情況下更改NSUserDefaults中的對象

它困擾我,要做到這一點,我必須創建整個字典的可變副本,更改一個元素並用新副本替換整個字典。

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]。程序運行可以通過myPrefs進行修改,而任何的喜好改變,然後保存通過調用[myPrefs save]根據需要:

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

作爲額外的獎勵,你可以結構MyPreferences類你喜歡的任何方式,帶來的好處面向對象程序設計的整套偏好。我在這裏展示了簡單的方法,只需使用可變字典,但是您可以將每個首選項設置爲屬性,併爲更復雜的對象(如NSColor)執行預/後處理。

相關問題