objective-c - 使用 KVO 观察自定义类的属性

标签 objective-c key-value-observing

我有 2 个类,Foo 和 Bar,如下:

@interface Foo : NSObject
   @property Bar *bar;
@end

@interface Bar: NSObject
   @property int intVal;
   @property long longVal;
@end

现在我想使用 KVO 来观察 Foo 类的对象的属性 bar 的变化。但我想知道如果我更改bar的属性之一,intVallongVal,是否有任何通知发送给观察者?

最佳答案

您可以使用 Foo 中的 KVO 观察 bar 的值变化,如下所示:

[bar addObserver:self
           forKeyPath:@"intVal"
              options:NSKeyValueObservingOptionNew
              context:nil];

[bar addObserver:self
           forKeyPath:@"longVal"
              options:NSKeyValueObservingOptionNew
              context:nil];

然后您需要实现 observeValueForKey 方法,如下所示:

- (void)observeValueForKeyPath:(NSString *)keyPath
                  ofObject:(id)object
                    change:(NSDictionary *)change
                   context:(void *)context {

    if ([keyPath isEqualToString:@"longVal"]) {
    // property longVal changed
    }
    ...
}

编辑:

已经指出的是答案的正确性,所以我会尽力使其更完整:

在 Foo 中声明一个全局变量,如下所示:

static void * const MyClassKVOContext = (void*)&MyClassKVOContext;

并在添加观察者时将其作为上下文传递:

[bar addObserver:self
           forKeyPath:@"longVal"
              options:NSKeyValueObservingOptionNew
              context:MyClassKVOContext];

最后,当你观察到:

- (void)observeValueForKeyPath:(NSString *)keyPath
                  ofObject:(id)object
                    change:(NSDictionary *)change
                   context:(void *)context {

        if (context != MyClassKVOContext) {
    [super observeValueForKeyPath:keyPath
                         ofObject:object
                           change:change
                          context:context]; return; }

    if ([keyPath isEqualToString:@"longVal"]) {
    // property longVal changed
    }
    ...
}

这将保证观察上下文的最大可能的唯一性。有关更完整的解释,请参阅评论中的链接答案,因为我仍然认为超出了本主题的范围。

关于objective-c - 使用 KVO 观察自定义类的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26547685/

相关文章:

ios - 在 UIImageView 上调整图像,如 FB 封面照片

objective-c - 在 Dealloc 中删除观察者

ios - 如何正确观察我的 scrollView 子类的 contentOffset 属性?

ios - UILabel 属性文本未更改

objective-c - 如何在 SKScene 上添加 NSTextField?

ios - UISearchDisplayController - 显示来自服务器的搜索结果

objective-c - UIPageViewController 工具栏上的页码

ios - 如何在 iOS 应用程序中撤销/取消/注销 "Location Services"

Swift KVO changeHandler 未被调用

ios - NSKeyValueObservation 不起作用,Swift 4