4

在我的界面中,我有一個NSTextField誰的value綁定到NSArrayController'sselection.selectedType.title。所有NSArrayController's對象都是自定義對象各有兩種方法:KVO:無法刪除觀察者

- (MYType *)selectedType; 
- (void)setSelectedType: (MYType *)type; 

有伊娃selectedType。但是,他們確實有一個iVar,持有所有MYType對象。該代碼歸結爲:

- (MYType *)selectedType 
{ 
    if (someIndex == 0) 
     return [types objectAtIndex: 0]; 
    else 
     return [self typeWithIndex: someIndex]; 
} 

- (void)setSelectedType: (MYType *)type 
{ 
    someIndex = [type index]; 
} 

MYType對象得到了NSString *title伊娃與相應@propertysynthesize

每當我打電話setSelectedType:,變化是在NSTextField立即可見,一切似乎工作,但我得到一個日誌消息說:

無法刪除觀察員NSArrayController的0x141160爲重點 路徑「selectedType。標題「,最可能的原因是 ,因爲在沒有發送適當的KVO通知的情況下更改了」selectedType「鍵值的 。檢查MY35類的KVO符合性 。

我試圖封裝setSelectedType:willChangeValueForKey:didChangeValueForKey:,然後我仍然有一個日誌消息,但不同的一個:

無法刪除觀察員NSKeyValueObservance 0x1c7570爲重點 路徑「稱號」,從MYType 0x1a4be0,因爲它未註冊爲觀察員 。

回答

5

首先,使用訪問器。不要直接訪問你的ivars。由於您直接修改了伊娃,因此您繞過了someIndex的KVO。除非必須,否則不要直接接觸ivars。

您還需要讓KVO知道selectedType取決於someIndex(和/或someStuff;從您的蒸餾代碼中不清楚)。

+ (NSSet *)keyPathsForValuesAffectingSelectedType 
{ 
    return [NSSet setWithObjects:@"someIndex", nil]; 
} 

這告訴志願系統,每當someIndex變化,這導致selectedType隱式的變化。請參閱Registering Dependent Keys

0

我遇到了同樣的錯誤,但出於不同的原因。可能值得一提的是,如果其他人在這裏結束。

我正在Swift上編寫一個應用程序,但我忘記在var前加上dynamic