我的模型类大多是使用合成的setter / getter方法实现的,一切都很好。一切都很好地连接到用户界面。我后来意识到更改一个属性会导致其他属性发生变化(更改type
可能会导致minA
和maxA
中的更改)所以我手动为{{1}编写了setter / getter方法属性。代码如下:
QBElementType
type
QBElement
@interface QBElementType : NSObject
@property NSRange minRange;
@property NSRange maxRange;
@end
@implementation QBElementType
@synthesize minRange;
@synthesize maxRange;
@end
问题:从那时起,每当我更改Element的类型时,我都会得到未捕获的异常:
无法更新观察者< NSTableBinder ...>对于关键路径 来自< QBElement ...>的“type.minRange”,很可能是因为其值 在没有适当的KVO通知的情况下更改了“类型”键 被送了。检查QBElement类的KVO-Compliance。
KVO-Compliance是否遗漏了一些明显的东西?为什么我会收到此错误?
答案 0 :(得分:3)
您无需明确调用-willChangeValueForKey:
和-didChangeValueForKey:
,因为您的setter命名正确。通过KVC / KVO机器的魔力自动添加对它们的调用。问题可能是它们被有效地调用了两次。
此外,由于minA
和maxA
似乎只是从类型派生而来,您可以将它们设为只读并告诉KVO自动通知观察者minA和maxA已经随时更改{{1更改:
type
答案 1 :(得分:2)
实施手动设置器并不意味着您必须实现手动KVO通知。如果您不通过设置器更新属性的支持ivar,那么您绝对需要这些。 KVO将自动替换您的setter,其版本在" real"之前和之后调用will / didChange方法。 setter被称为。如果您想在自己的setter中自己调用它们(例如,您需要更精确地控制它们被调用的时间),则需要覆盖方法+automaticallyNotifiesObserversForKey:
以返回NO
type
}键。
我认为你现在收到错误的原因是因为KVO机器看到你连续两次调用[self willChangeValueForKey:@"type"]
(一次通过KVO"魔术&# 34;,一次手动)而不调用[self didChangeValueForKey:@"type"]
。
答案 2 :(得分:0)
正如其他人所说,您可以放弃willChangeValueForKey:
,didChangeValueForKey:
来电并实施:
+ (NSSet *) keyPathsForValuesAffectingMinA
{
return [NSSet setWithObject:@"type"];
}
当然,minB
也是如此。
然后将minA
和minB
设为只读属性。
不同的方法主要是风格偏好。