0

當我的數組控制器刷新了從服務器請求中檢索的新數據時,我遇到了問題。觀察對象未註冊爲觀察者

的設置

我有一個實體對象(稱之爲MyParent),其中有幾個特性:

 
name 
age 
description 
widgetID 

並且具有一些屬性的實體對象(稱之爲進myWidget):

 
name 
size 
description 

大小是一個NSSize對象的字符串表示。它使得從核心數據存儲和服務器輕鬆存儲和檢索,並返回到JSON。爲了表示UI中的大小,我已經將MyWidget子類化並提供了一個自定義setter和getter作爲自定義類的類別(我這樣做是爲了讓Xcode不會覆蓋我的更改,如果我需要更改模型):

-(void)setObjectWidth:(NSInteger)aValue { 
    [self setObjectSize:NSMakeSize(aValue, [self objectHeight])]; 
} 

-(void)setObjectHeight:(NSInteger)aValue { 
    [self setObjectSize:NSMakeSize([self objectWidth], aValue)]; 
} 

-(void)setObjectSize:(NSSize)aValue { 
    [self setSize:NSStringFromSize(aValue)]; 
} 

-(NSInteger)objectWidth { 
    return [self objectSize].width; 
} 

-(NSInteger)objectHeight { 
    return [self objectSize].height; 
} 

-(NSSize)objectSize { 
    return NSSizeFromString([self size]); 
} 

我做的widgetId查找作爲父類別方法得到widget

-(MyWidget *)widget { 
    NSManagedObjectContext * moc = [[NSApp delegate] managedObjectContext]; 

    return [moc fetchObjectForEntityName:@"MyWidget" 
           withUID:[self widgetID]]; 
} 

的fetchObjectForEntityName:withUID是在管理對象方面類別。

在UI中我有一個數組控制器綁定到MyParent對象的tableView。選擇對象呈現被綁定到適當的值在用戶界面中的細節:

 
parentArrayController --> parentArray (managed objects in an array) 
parentTable --> parentArrayController.arrangedObjects.name 

uiWidthTextField --> parentArrayController.selection.widget.objectWidth 
uiHeightTextField --> parentArrayController.selection.widget.objectHeight 

陣列控制器被觀察到的變化,使得它可以發射關閉相應需要知道該應用程序的其它部分的通知選擇的對象改變

什麼工作

一切運作良好。我可以對用戶界面中的文本字段進行更改,並根據您的需要設置和獲取小部件的大小。添加父項是創建NSURLConnection並將適當的參數發送到服務器的簡單任務。當服務器確認添加時,我再次請求父服務器的列表。

下來的列表將與核心數據中的現有列表進行比較,並添加新項目並對已存在的其他對象值進行任何其他更改。

什麼地方不對頭

當列表回來,它被正確解析,但應用程序抱怨時,陣列控制器被更新:

嚴重的應用程序錯誤。核心數據更改處理期間發生異常:無法從關鍵路徑「widget.objectHeight」中刪除觀察者,因爲它未註冊爲觀察者。 with userInfo(null)

無法刪除關鍵路徑「widget.objectHeight」的觀察者,因爲它沒有註冊爲觀察者。

我已經試過

我已嘗試添加一個willChangeValueForKey:和didChangeValueForKey:纏objectHeight和objectWidth的二傳手,但這似乎不提供追索權。

我相信這個問題是因爲IB綁定到widget.objectHeight,而widget是父級查詢,而不是真正的KVO/KVC屬性。不過,我並不需要widget上的二傳手(儘管我會在下一步嘗試)。

我知道我錯過了一些東西,但不能把我的手指放在上面。

的抗辯

任何幫助或協助解決這項援助將非常感謝!

回答

0

您需要將objectWidthobjectHeight設置爲MyWidget的非模型屬性。您遇到KVO問題,因爲objectWidthobjectHeight不是MyWidget的鍵,只是以getter和setter的形式擁有方法名稱。

只需添加:

@property() NSInteger objectWidth; 
@property() NSInteger objectHeight; 

到進myWidget類和應提供志願工作的關鍵。 (可能要仔細檢查我的財產形式,這是一段時間的感覺,我不得不寫一個整數屬性。)

+0

感謝您的迴應。我試着給模型添加@property,但它沒有什麼區別。然後用適當的willChangeValue和willAccessValue包裝每個setter/getter。沒有快樂。然後我將這些從類別中直接移到模型對象上。仍然沒有運氣:-(盡我所能說它是失敗的,正如你指出的那樣,這是有道理的,我也嘗試用automaticNotifiesObserversForKey禁用自動通知,併爲這些鍵返回NO(objectHeight等)。 – Hooligancat 2011-04-12 23:46:04

+0

終於回過頭來解決我的問題,你的解決方案工作,我沒有意識到,我已經設置了setter和getters不做自動通知,因此合成的setter和getter沒有發射KVC通知。工作得很好,謝謝! – Hooligancat 2011-05-12 23:38:51