2013-02-25 54 views
10

如何將NSArrayController的內容綁定到有序對多關係中的實體?使用NSArrayController綁定有序關係

我在我的核心數據模型中有一個無序的一對多關係,並且一個NSArrayController的內容集與父實體的關係綁定在一起。這工作正常,數據可以從NSArrayController訪問,沒問題。

我在開發過程中決定允許用戶手動重新排序這些子對象會更好,因此我將關係更改爲有序對象。現在,正在從我的筆尖創建我的NSArrayController的時候,提出了以下錯誤:

Cannot create NSSet from object Relationship '...' fault on managed object ... of class _NSFaultingMutableOrderedSet 

現在實際上,我認爲這一切是有道理的:這是一個有序的關係,所以現在我發現了一個有序集合。將它綁定到Content Array也是不合適的,因爲它現在是一個NSOrderedSet,而不是一個數組。我的問題是:現在我該如何將這個關係的數據綁定回NSArrayController?

+0

我也遇到過這個問題,我相當確信這是一個錯誤'NSArrayController' - 提交了一個錯誤報告。 – Vervious 2013-03-24 01:47:54

+0

看來,根據Hal的答案中提到的解決方法,真的沒有人有一種「真實」的方式來綁定它。我也會做一個錯誤報告,因爲它應該是一個showstopper,解決方法或不。 – Khakionion 2013-03-25 06:09:47

回答

8

根本問題是核心數據有序對多關係返回一個NSOrderedSet,而NSOrderedSet不是NSSet的子類。任何期望NSSet的陣列控制器綁定都會失敗。

Tom Fewster有一個detailed blog post描述使用NSValueTransformer來解決這個缺點,在NSOrderedSet和NSArray之間進行轉換。他還提供了一個sample implementation on Github

+0

謝謝!正如我在問題的最後一段所指出的那樣,我知道NSSet的繼承(而不是缺乏)是目前所存在的綁定問題。但是這種價值轉換方法是一種拯救生命的方式!我一定會看看它。 – Khakionion 2013-03-25 06:07:55

+3

解決方法(我認爲)的問題是不會使用可變訪問器,這意味着任何更改都意味着重新分配/重新整理整個集合。 – Vervious 2013-03-26 21:11:45

9

我在搜索過程中看到這個討論是否有任何新的發展。在運輸應用程序中,我目前將陣列控制器的內容數組綁定到[email protected],它工作得很好,不知道我是否發現自己或者其他人在某處推薦它。

+0

這顯然是解決方案。 – Altimac 2013-11-30 05:20:53

+2

我不確定這是否是解決方案,因爲「數組」操作符調用NSOrderSet的「數組」方法,該方法返回一個「外觀」數組對象,該數據對象在設計中是不可變的(請參閱NSOrderSet.h中的頭文件doc )。這意味着,NSArrayController可以「綁定」,但無法對NSOrderedSet進行任何更改。這不過是中途綁定。只讀解決方案。 – 2014-03-28 05:52:40

+0

的確相當確實。如果你需要可變性,這將會失敗。接得好;) – Altimac 2014-08-14 11:56:42

相關問題