【问题标题】:Observe value changes of NSDictionary inside NSArray观察 NSArray 内部 NSDictionary 的值变化
【发布时间】:2014-02-17 04:58:48
【问题描述】:

这是我的NSArray

carType (
        {
        isSelected = 0;
        kFieldName = "All types";
        kObjectValue = 0;
        kObjectValueText = All;
    },
        {
        isSelected = 0;
        kFieldName = "4 seats";
        kObjectValue = 4;
        kObjectValueText = "4 seats";
    },
        {
        isSelected = 1;
        kFieldName = "7 seats";
        kObjectValue = 7;
        kObjectValueText = "7 seats";
    }
)

如何观察isSelected 字段的变化? 我在代码中使用了 KVO,但它不起作用。

carTypecontextNSArray 属性

- (void)viewDidLoad
{
    [super viewDidLoad];
    [context addObserver:self forKeyPath:@"carType" options:NSKeyValueObservingOptionNew context:NULL];
}


-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
    if ([keyPath isEqualToString:@"carType"]) {
        NSLog(@"carType changed");
    }
}

//dealloc remove observer

【问题讨论】:

标签: ios objective-c nsarray nsdictionary key-value-observing


【解决方案1】:

要观察数组中每个字典的isSelected 的变化,您必须将数组中的每个字典都注册为观察者。正如我在my book 中所说:

您可以使用 NSArray 的实例方法 addObserver:toObjectsAtIndexes:forKeyPath:options:context: 有效地做到这一点,但如果数组本身是可变的,那么您还必须使用随后添加到数组中的任何新字典注册该键(并取消注册当从数组中删除字典时)。

最后一部分可能会让人望而生畏。在许多情况下,最好完全放弃,只使用一个自定义类,当它发生变异时会发出通知(而不是 NSDictionary,而不是 KVO)。

【讨论】:

  • 另外,这仅在字典可变的情况下才有效,因为如果字典本身被删除,观察者也会一样。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-29
  • 1970-01-01
  • 2013-03-31
  • 2011-04-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多