我有一个核心数据实体“bid”,它与许多“项目”有关系,称为“itemLink”。
在IB中,我有一个文本字段绑定到“total”,这几乎可以工作。在“bid.m”中我有:
- (NSDecimalNumber *)total
{
return [self valueForKeyPath:@"itemLink.@sum.price"];
}
我也有:
+ (NSSet *)keyPathsForValuesAffectingTotal {
return [NSSet setWithObjects:@"itemLink", nil];
}
添加或删除项目时,“总计”会按预期更新。但是,如果您更改了itemLink集合中的“项目”,则总计不会刷新。如何让KVO查看链接的NSSet中的相关对象何时发生变化?
由于
答案 0 :(得分:7)
看起来您的问题与keyPathsForValuesAffectingTotal
仅提到keyPath“itemLink”这一事实有关。
由于这是多对多关系的路径,因此您有效地告诉您的出价对象观察变更集。集合所做的就是管理对象是否是其成员。这就解释了为什么在“itemLink”中添加或删除项目时会获得更新,但仅限于此。
您不仅仅对哪些项目是该组成员感兴趣,您还对这些成员的(可变)属性感兴趣 - 在这种情况下价格。因此,除了上述内容之外,您还希望“itemLink”的每个成员通知所有观察者相关的投标对象的“总”关键字“价格”随时更改。
不幸的是,它并不像在Bid类中添加“itemLink.price”作为依赖关键路径那么简单,因为KVO不允许您观察“通过”到多对的关系。
如果对Item实体的实例使用NSManagedObject子类,则可以手动添加此功能。覆盖Item类中的+ automaticallyNotifiesObserversForKey:
以告诉Cocoa您将手动为“price”键管理KVO通知,然后实现您自己发送相应通知的setPrice:
方法。像这样:
- (void)setPrice:(id)inPrice
{
// bid = inverse relationship of itemLink
[[self valueForKey:@"bid"] willChangeValueForKey:@"total"];
[self willChangeValueForKey:@"price"];
[self setPrimitiveValue:inPrice forKey:@"price"];
[self didChangeValueForKey:@"price"];
[[self valueForKey:@"bid"] didChangeValueForKey:@"total"];
}
答案 1 :(得分:1)