oluşturma ve yeniden ayar kopya olmadan NSUserDefaults nesneleri değiştirin

oy
6

Ben saklanan sözlük var NSUserDefaultsve ben bu sözlükte öğeleri eklemek / kaldırmak gerekir.

Ben, bütün sözlüğün değişken kopyasını oluşturmak bir elemanın değiştirilmesi ve yeni bir kopya ile tüm sözlüğü değiştirmek zorunda bunun için beni rahatsız ediyor.

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

ve daha da kopyalama ve hiyerarşi içinde derin nesneler için yeniden ayar gerektirir.

Daha iyi bir yolu var mı?

Ben kullanmayı denedim [defaults setValue:… forKeyPath:@foo.bar](nesne değişken değildir) ama bu işe görünmüyor.

Oluştur 14/08/2009 saat 12:07
kaynak kullanıcı
Diğer dillerde...                            


1 cevaplar

oy
5

Ben genellikle benim uygulama tercihlerinin tüm barındırmak için özel sınıf oluşturmak. Bu sınıf programı başladığında, bir zamanlar userDefaults kesilebilir kopyalarını yüklemek ve sonra artan her yol boyunca kaydeder işleyebilir:

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

Ben buna sonra benim uygulama temsilci bu sınıfın bir örneğini oluşturmak ve [myPrefs load]başvurum başlattığında. Herhangi tercihleri çalıştıran programı aracılığıyla değiştirilebilir iken değişti myPrefsarayarak ve ardından kaydedilen [myPrefs save]istediğiniz gibi:

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

Ek bir avantaj olarak, yapılandırmanın MyPreferencestercihlerinin bütün setine OO programlama faydaları getirerek, sınıf istediğiniz şekilde. Ben sadece bir değişken sözlük kullanılarak, burada kolay bir yol gösterdi, ancak bir mülkte her tercihini yapmak ve benzeri daha karmaşık nesneler için öncesi / sonrası işleme yapabilir NSColormesela.

Cevap 14/08/2009 saat 13:08
kaynak kullanıcı

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more