2010-08-22 58 views
0

我對自定義視圖的綁定屬性有問題。該屬性綁定到核心數據實體的NSArrayController。將NSArrayController綁定回ivar的問題

問題出在這裏:

在我看來,我畫了幾個矩形。這些矩形的位置保存在覈心數據的實體中(如NSValue包裝的NSRects)。矩形是可拖動的,當我拖動一個矩形時,我希望實體更新到新的位置。 但我找不出如何將arrayController綁定回視圖。

這裏就是一切是如何連接:

  • 我有網點的觀點和arrayController一個windowController。

  • arrayController綁定到windowController的managedObjectContext,因此綁定到我的核心數據模型。 (即結合和該實體的結合建立在界面生成器)

  • 視圖綁定到arrayController與上結合是建立在使用windowController一個實例變量「rectangleValuesArray」

[connectionsView bind:@"rectangleValuesArray" 
      toObject:elementsArrayController 
      withKeyPath:@"arrangedObjects.rectangleValue" 
       options:nil]; 

到目前爲止工作。

現在我試圖建立綁定在向另一個方向:

[elementsArrayController bind:@"arrangedObjects.rectangleValue" 
        toObject:connectionsView 
        withKeyPath:@"rectangleValuesArray" 
         options:nil]; 

現在,當我改變我的伊娃,實體應該更新(右?)。 但是,這並不工作 - 我得到的是從控制檯:

Cocoa Bindings: Error setting value for bound property arrangedObjects.rectangleValue of object <NSArrayController: 0x200027100>[entity: Element, number of selected objects: 1]: [<NSArrayController 0x200027100> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key arrangedObjects.rectangleValue. 

什麼我收到錯在這裏?請有人幫忙?

西蒙

回答

2

一些事情。

首先,異常是正確的:不可能設置任何NSValue對象的矩形值。它們是不可變的。

這聽起來像你試圖維護平行數組,矩形數組是其中之一。不要那樣做;綁定扼殺它,它也使AppleScript支持更難。

你需要做的是實現模型對象,並保持一個單一的數組。無論您現在擁有哪些陣列(包括矩形之一),都應該成爲模型對象的屬性 - 每個對象都有一個矩形,以及其他任何事物。

另一件事是,你不把控制器綁定到視圖;您將視圖綁定到控制器。已經完成了,你就完成了。

如果可能的話,您也可以考慮在IB中而不是在代碼中進行設置。不要拒絕使用IB;這是你的朋友。

+0

嗯,首先,非常感謝! 那麼你的意思是說,我爲我的對象創建了一個模型類,並將它添加爲我的核心數據實體的屬性? 我該怎麼做關於該實體的關係?我是否應該在模型類中實現它們? 我在這裏想要做的是創建類似OmniGraffle的東西。我想在IB中創建綁定,但我無法弄清楚 - 這是我繪製矩形的自定義視圖(當然,它們是小文本「窗口」)。他們不在IB ...... 或者將所有東西都與視圖的出口綁定在一起? – Simon 2010-08-22 12:59:14

+0

對於核心數據,您的模型對象類應該是NSManagedObject的子類,並且應該是實體本身的類。您可以在託管對象模型中設置它。要在IB中公開綁定,您需要編寫一個包含您的視圖的IB插件。綁定和插座不相關。 – 2010-08-22 14:04:29

+0

哦。事實上,我已經有了這個模型對象類......我做了一個數組,而不是每個屬性的數組 - 你怎麼能看到我有更多的數組而不是矩形值數組?無論如何。它現在有效!謝謝! – Simon 2010-08-22 16:43:18

0

不能完全確定我跟着你在做什麼有,但你有沒有考慮這種方法:

  • 給視圖的IBOutlet NSArrayController* myArrayController伊娃您的陣列控制器(可能已經有類似的東西是,我想),並設置在IB
  • 連接從窗口控制器忽略你的兩個手工綁定電話

現在爲了從視圖內修改陣列控制器的內容,您可以撥打[myArrayController mutableArrayValueForKeyPath:@"arrangedObjects.rectangleValue"],其中應該爲您提供了一個代理,您可以隨意使用KVO更新修改該密鑰路徑。

希望這不完全是重點。

+0

爲NSValue對象的'rectangleValue'屬性獲取可變數組不會幫助他設置不可變對象的屬性(NSValues是不可變的 - 注意它們缺少任何'setWhateverValue:'方法)。如果他能做到這一點,從代碼綁定切換到綁定在IB將使事情變得更容易,但它不會解決他的任何問題。 – 2010-08-22 11:17:59

+0

哦..我完全忽略了不變性,相反,我不知何故將錯誤消息誤解爲投訴,認爲該視圖缺少符合KVO標準的IVAR訪問器。你當然是對的。 – ig2r 2010-08-22 11:56:11

相關問題