2011-06-13 144 views
2

我遇到了UITableViews和多對多關係的問題。UITableView和核心數據對多關係

我有兩個類,A和B,它們都擴展NSManagedObject並存在於Core Data中。每個人都有一個一對多的關係,其他:

一個< < - >> B

我想用A類對象作爲一個UITableView的部分,它的集合B的對象爲「數據行」在TableView中。這是否可能,以及實現這一目標的最佳方法是什麼?最好我想使用NSFetchedResultsController來管理UITableView提供的數據,但到目前爲止,我還沒有能夠提出一個可用的謂詞和節名稱鍵路徑。

回答

1

我會使用NSFetchedResultsController來監視A對象。使用您獲取的結果來填充節標題。然後當你正在尋找填充你的「數據行」時,你可以找到你當前的A對象(通過使用[[fetchedResultsController fetchedResults] objectAtIndex:indexPath.section]或類似的東西),並用A.BOjbects從它中提取B對象,它返回與A相關的所有B對象的NSSet目的。完成之後,您可以按照您的要求對列表進行篩選或排序,然後再將它們放入行中

+0

我使用這種方法解決了它 - 使用獲取的結果控制器來觀察節,然後用每個節的相關對象填充行。似乎到目前爲止工作得不錯。 – Malakim 2011-06-16 06:07:10

2

您不能使用抓取的結果控制器來執行此操作。

如果A對象是部分名稱和每個B對象有許多A關係那麼每個B可以在表中顯示多次在不同的部分。核心數據是圍繞獨特對象的思想而建立的,所有tableview的樣板代碼都假定每行代表一個唯一的對象。在這種情況下,即使統計行數也很困難,並且sectionNameKeyPath將無法設置,因爲它可能在任何時候都有多個值。

您需要手工配置所有這些。您必須獲取A對象,然後設置節標題,然後您將必須獲得每個A.bObjs,並對每個節中的行進行單獨計數和排序。刪除一個存在的B對象可能會很困難,因爲它可能會觸發同時刪除多行。

我會敦促你重新考慮你的設計。節和節標題不應該表示託管對象,而應該是基於行對象的一個​​屬性對行所表示的託管對象進行分組。你真正想要的是一個主 - 細節視圖層次結構。頂部tableview將顯示所有A對象。選中某行後,它將加載第二個表格視圖,該視圖顯示與所選A對象相關的所有B對象。

+0

是的,我知道 - 不幸的是UI設計大部分都不在我的手中。 – Malakim 2011-06-16 06:08:07