8

我有一個核心數據實體「bid」,它與許多「items」有關係,稱爲「itemLink」。在一對多關係中觀察依賴鍵

在IB中,我有一個綁定到「total」的文本字段,這幾乎可以工作。

在 「bid.m」 我有:

- (NSDecimalNumber *)total 
{ 
    return [self valueForKeyPath:@"[email protected]"]; 
} 

我也有:

+ (NSSet *)keyPathsForValuesAffectingTotal { 
    return [NSSet setWithObjects:@"itemLink", nil]; 

} 

添加或刪除的項目, 「總」 更新按預期。但是,如果更改itemLink集合中的「項目」,則總數不會刷新。如何讓KVO查看鏈接的NSSet中的相關對象何時發生變化?

感謝

回答

7

它看起來你的問題是與事實keyPathsForValuesAffectingTotal只提到的keyPath「itemLink」做。

由於這是一對多關係的路徑,因此您可以有效地告訴您的出價對象觀察一組變更。所有這些都是管理對象是否是它的成員。因此,這解釋了爲什麼當您從「itemLink」添加或刪除項目時獲得更新,但僅此。

您不僅對哪些項目是該集合的成員感興趣,還對這些成員的(可變)屬性感興趣 - 在這種情況下爲價格。因此,除上述之外,您還希望「itemLink」的每位成員在所有觀察員通知相關投標對象的「總計」鍵時,「價格」每當它發生變化時都會發生變化。

不幸的是,它不像在您的Bid類中將「itemLink.price」添加爲依賴關鍵路徑那麼簡單,因爲KVO不允許您觀察「通過」多對多關係。

如果您爲Item實體的實例使用NSManagedObject子類,則可以手動添加此功能。在您的Item類中重寫+ automaticallyNotifiesObserversForKey:以告訴Cocoa您將手動管理「價格」鍵的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"]; 
}