【问题标题】:How to programmatically monitor KVC object?如何以编程方式监控 KVC 对象?
【发布时间】:2023-03-16 21:04:02
【问题描述】:

我正在尝试通过代码监视 NSMutableArray 的更改。我想在数组更改时添加一个观察者,但我看不到 NotificationName 应该是什么来实现这一点。

基本上,当数组被修改时,我想执行一个自定义选择器。

【问题讨论】:

    标签: objective-c xcode macos key-value-observing key-value-coding


    【解决方案1】:

    我不是 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]);
    }
    

    请注意,这一方法将收集所有此对象已注册的观察结果。如果你注册同一个对象来观察许多不同的键,当这个方法被调用时你可能不得不区分它们;这就是 keyPathobject 参数的目的。

    问题以及我不确定这是否适合您的原因是,这假定数组在您的代码中,因为您需要包装对它的访问才能发送通知。

    [self willChangeValueForKey:@"theArray"];
    [theArray addObject:...];
    [self didChangeValueForKey:@"theArray"];
    

    一个任意的框架类将有一些属性和一些不符合 Key-Value Observing 的属性。例如,NSWindowfirstResponder 兼容 KVO,但其 childWindows 不兼容。当然,文档会告诉您哪些是哪些。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-23
      • 2011-02-07
      • 2015-01-10
      • 2016-10-10
      • 2020-05-18
      • 2013-12-04
      相关资源
      最近更新 更多