我的AppDelegate中有一个名为blocks的NSMutableArray属性.每当一个对象被添加到这个数组时我想观察.我读过其他帖子,但我不明白为什么这不起作用.
在我的app委托类中,我实现了
- (void)insertObject:(id)obj inBlocksAtIndex:(NSInteger)index
{
[blocks insertObject:obj atIndex:index];
}
Run Code Online (Sandbox Code Playgroud)
在我的视图控制器的init方法中,我将一个观察者添加到我的AppDelegate引用中.
boardModel = [[UIApplication sharedApplication] delegate];
[boardModel addObserver:self forKeyPath:@"blocks" options:0 context:NULL];
Run Code Online (Sandbox Code Playgroud)
在我的视图控制器的viewDidLoad方法中,我尝试调用我之前实现的KVO索引数组访问器,
[boardModel insertObject:[[Block alloc] init] inBlocksAtIndex:0];
Run Code Online (Sandbox Code Playgroud)
然后我实现我的observeValueForKeyPath方法:
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
if ([keyPath isEqualToString:@"blocks"])
{
NSLog(@"ADDED");
}
}
Run Code Online (Sandbox Code Playgroud)
我已经尝试在observeValueForKeyPath中的if语句之前添加一个NSLog语句,似乎它永远不会被调用.
我也尝试了NSLogging [[boardModel blocks] count],它说计数为1(正在添加对象).
我肯定错过了什么.
Pau*_*nch 12
问题是NSArrays不尊重KVO,因此观察关键路径计数将不起作用.
如果这是MacOSX,请使用NSArrayController.否则为数组创建一个包装类,在添加/删除数组内容时触发KVO调用,并传递所有其他调用.