2

我在我的OS X應用程序中使用Core Data,我有一些TableViews綁定到NSArrayControllers。我遇到的問題是,當我試圖使用數組控制器填充工作表中的表格視圖時,我不希望內容持續存在。使用沒有核心數據的NSArrayController

下面是應用程序如何掛在一起;

窗口1 - 顯示錶格視圖中的用戶列表,並允許添加和刪除用戶。內容通過核心數據綁定持久化。

窗口2 - 顯示錶格視圖中的組列表。第二個表視圖顯示屬於所選組的用戶的列表。內容通過核心數據綁定持久化。 「添加用戶」按鈕會調用工作表來將用戶添加到組中。

添加用戶工作表 - 此工作表顯示的用戶不是所選組的成員。按工作表上的關閉按鈕將選定的用戶添加到選定的組。

好吧,所以我遇到的問題是用於添加用戶工作表的數組控制器。當我調用工作表時,我遍歷所有用戶,並將任何用戶添加到數組控制器中,如果他們不在組中。當我關閉工作表時,我嘗試使用removeObject清除數組控制器:但這會導致「不能與ModelObjectContect一起使用此方法」。

爲什麼我需要一個MOC從陣列控制器中刪除項目?它僅用於顯示目的,所以我不需要它來堅持。如果我將陣列控制器MOC設置爲我的應用程序委託的陣列控制器,它實際上會刪除用戶,而我顯然不想這麼做。我只是想從表格的表格視圖中刪除它們。

我認爲答案可能是創建另一個MOC作爲便箋簿使用,而不是將其綁定到持久存儲區,但是這只是在使用removeObject時給了我一個不同的錯誤:沿着「can不要刪除另一個MOC中存在的對象。「

爲什麼我允許將對象添加到數組控制器但不刪除它們?如果您實際上不希望物品被移除,您應該訪問底層的「內容」,例如[arraycontroller內容]?我玩過這個遊戲,但得到了奇怪的顯示效果,因爲它似乎與陣列控制器背後的內容一起玩。如果我這樣做,有沒有辦法告訴陣列控制器「順便說一句,我一直在修補你的內容,你可能需要讓自己在一起」?

它看起來像我不應該使用沒有核心數據的陣列控制器,但在文檔中有許多意見表明它可以使用和不使用核心數據。

回答

2

是的,你可以使用沒有核心數據管理對象上下文的數組控制器。但是,由於您在其中存儲了NSManagedObject實例,因此我認爲它會在刪除它們時嘗試標記它們以進行刪除。

如果您使用託管對象並且不希望在刪除時刪除數組控制器的內容,則必須使用Cocoa綁定將數組控制器的內容綁定到另一個對象的屬性。

但有一個更簡單的解決方案。我建議你將數組控制器的託管對象上下文設置爲主MOC並使用謂詞來過濾它的內容。

[arrayController setPredicate:[NSPredicate predicateWithFormat:@"NONE groups == %@", group]]; 

因此,不需要在陣列控制器中添加或刪除用戶,因爲已經在組中的所有用戶都將被隱藏。

+0

我認爲這是我的答案,但我無法得到正確的謂語。你已經使用了CONTAINS,但是這是用於字符串的,不是嗎?我嘗試過使用IN,但無法獲得任何快樂,因爲我是一個謂詞noob。我想我需要像[sheetUsersAC setFetchPredicate:[NSPredicate predicateWithFormat:@「NOT%@ IN組」,[groupsAC選擇]]],但這是行不通的。如此接近...... – swampf0etus 2012-03-20 13:14:25

+0

是的,你是對的:'CONTAINS'只適用於字符串。我的錯。我認爲''NONE groups ==%@「'應該可以工作。 – 2012-03-20 17:14:17

+0

終於破解了!我沒有意識到選擇返回代理對象而不是源對象。爲了從選擇中獲得源對象,我必須使用valueForKey:@「self」。一旦我明白了這一點,我發現我可以使用「NONE groups ==%@」或「NOT%@ IN groups」:'[sheetUsersAC setFetchPredicate:[NSPredicate predicateWithFormat:@「NOT%@ IN groups」,[[groupsAC selection] valueForKey:@ 「自我」]]]' – swampf0etus 2012-03-20 21:50:31

1

您可以在有和沒有核心數據的情況下使用它們,但是陣列控制器要麼使用核心數據(實體支持),要麼不使用核心數據。我不認爲你可以使用一個託管對象和而不是有一個上下文。

我不清楚你爲什麼要創建對象而不是僅僅使用獲取請求?

你不說你是如何添加「缺少」用戶的,但如果這只是一個基本列表,你可以考慮創建一個代理對象數組(這樣你就不會觸碰MOC)當工作表完成時。你可以使用一個非核心的數據數組控制器,或者僅僅使用(gasp!)不使用綁定,並以舊式的方式進行。

0

爲什麼不使用[arrayController setContent:nil]

相關問題