gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 21:22:33 24 4
gpt4 key购买 nike

我有 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com