2013-04-11 66 views
0

UIViewController子类上有一个属性,当视图变为可见时该属性发生更改。 (A组停止是空的)。我实现KVC/KVO如下:为什么KVO观察者在观察无序对多关系时看到空的NSKeyValueChangeNewKey?

- (void)viewWillAppear:(BOOL)animated { 
    [self willChangeValueForKey:@"anticipatedIndexPaths" withSetMutation:NSKeyValueSetSetMutation usingObjects:_anticipatedIndexPaths]; 

    [super viewWillAppear:animated]; 
} 

- (void)viewDidAppear:(BOOL)animated { 
    [super viewDidAppear:animated]; 

    assert([_anticipatedIndexPaths count]); 
    [self didChangeValueForKey:@"anticipatedIndexPaths" withSetMutation:NSKeyValueSetSetMutation usingObjects:_anticipatedIndexPaths]; 
} 

该类的子类是观察本身@"anticipatedIndexPaths",但NSKeyValueChangeNewKey值时观测NSKeyValueChangeReplacement始终是一个空集。是什么赋予了?

回答

1

明白了。两件事:

首先,至少对于无序的一对多关系,KVO基础架构记录您的财产在willChange-:调用上的价值。在didChange-:上,它只通过给定集合减去以前的值。其次,在viewWillAppear:之前,甚至在拨打[super viewWillAppear:]之前,hidden == NO

在我的情况下,这意味着属性返回非空集。 KVO减法的结果是空集。

0

当您拨打addObserver:...时,您是否通过NSKeyValueObservingOptionNew作为选项?默认情况下你不会得到这个值。

+0

好想,但是,我是。 'self addObserver:self forKeyPath:@“expectedIndexPaths”options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld | NSKeyValueObservingOptionInitial context:nil];' – Sam 2013-04-11 15:47:10