【发布时间】:2023-03-16 21:04:02
【问题描述】:
我正在尝试通过代码监视 NSMutableArray 的更改。我想在数组更改时添加一个观察者,但我看不到 NotificationName 应该是什么来实现这一点。
基本上,当数组被修改时,我想执行一个自定义选择器。
【问题讨论】:
标签: objective-c xcode macos key-value-observing key-value-coding
我正在尝试通过代码监视 NSMutableArray 的更改。我想在数组更改时添加一个观察者,但我看不到 NotificationName 应该是什么来实现这一点。
基本上,当数组被修改时,我想执行一个自定义选择器。
【问题讨论】:
标签: objective-c xcode macos key-value-observing key-value-coding
我不是 100%,但我很确定 Key-Value Observing 是你想要的。
关心数组的任何对象都将自己注册为观察者:
[objectWithArray addObserver:self
forKeyPath:@"theArray"
options:NSKeyValueObservingOptionNew
context:nil];
然后它将收到数组已更改的通知:
- (void)observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object
change:(NSDictionary *)change
context:(void *)context {
NSLog(@"Change is good: %@", [change objectForKey:NSKeyValueChangeNewKey]);
}
请注意,这一方法将收集所有此对象已注册的观察结果。如果你注册同一个对象来观察许多不同的键,当这个方法被调用时你可能不得不区分它们;这就是 keyPath 和 object 参数的目的。
问题以及我不确定这是否适合您的原因是,这假定数组在您的代码中,因为您需要包装对它的访问才能发送通知。
[self willChangeValueForKey:@"theArray"];
[theArray addObject:...];
[self didChangeValueForKey:@"theArray"];
一个任意的框架类将有一些属性和一些不符合 Key-Value Observing 的属性。例如,NSWindow 的 firstResponder 兼容 KVO,但其 childWindows 不兼容。当然,文档会告诉您哪些是哪些。
【讨论】: