1

KVOを介して、ユーザー設定を保存するNSDictionaryを監視しています。

設定ディクショナリが変更されたら、クラスのプロパティを新しい値に更新したいと思います。

私にはいくつかのサブクラスがあり、それぞれが異なるプロパティを持っています。サブクラスのさまざまなプロパティに対して、NSDictionaryの値をプロパティに正しく割り当てることができる単一のメソッドをスーパークラスに含める方法を探しています。

//Observe when user toggles preferences
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context 
{
    NSDictionary *prefs = [change objectForKey:NSKeyValueChangeNewKey];

    //I know I can do...
    //Subclass1
    self.isEnabled = [[prefs objectForKey:@"isEnabled"] boolValue];
    self.color = [[prefs objectForKey:@"color"];
    self.width = [[prefs objectForKey:@"width"];

    // -- or -- 

    //Subclass2
    self.isEnabled = [[prefs objectForKey:@"isEnabled"] boolValue];
    self.weight = [[prefs objectForKey:@"weight"];
    self.age = [[prefs objectForKey:@"age"];
    //...etc.

    //But I would prefer to do something like this... (Pseudocode)
    for (id key in prefs)
    {
        id value = [prefs objectForKey:key];
        [self propertyNamed:key] = value; // How can I accomplish this?
    }
}

メソッドをサブクラス化して、各サブクラスにカスタムメソッドを使用して特定のプロパティを処理させることができることはわかっています。スーパークラスがすべてのサブクラスを処理する方法を探しています。

明らかに、ここにはいくつかのケースがあります...辞書にキーがあり、そのプロパティがクラスに存在しない場合など。今はそれを無視しましょう。

これを行うためのアイデアはありますか?

4

1 に答える 1

11

NSKeyValueCodingを参照してください。

[self setValue:... forKey:@"color"];
color = [self valueForKey:@"color"];
于 2013-03-21T21:38:07.997 に答える