我遇到了UITableViews和多对多关系的问题。
我有两个类,A和B,它们都扩展了NSManagedObject并且存在于Core Data中。每个人都与另一个有很多关系:
A<< - >>乙
我想使用A类的对象作为UITableView的部分,并将它的B对象集合作为TableView中的“数据行”。这是可能的,实现这一目标的最佳方法是什么?我最好使用NSFetchedResultsController来管理UITableView提供的数据,但到目前为止,我还没有能够提出一个有效的谓词和段名密钥路径。
答案 0 :(得分:2)
您无法使用提取的结果控制器执行此操作。
如果A
个对象是部分名称,并且每个B
个对象都有很多A
个关系,那么每个B
可以在不同的部分中多次显示在表中。核心数据实际上是围绕唯一对象的思想设置的,并且tableviews的所有样板代码都假定每行代表一个唯一对象。在这种情况下,即使计算行数也很困难,并且sectionNameKeyPath将无法设置,因为它可能在任何时候都有多个值。
您需要手动配置所有这些。您必须获取A
个对象然后设置部分标题,然后您必须获取每个A.bObjs
并对每个部分中的行进行完全单独计数和排序。删除存在的B
对象可能会很困难,因为它可能会同时触发删除多行。
我会劝你重新考虑你的设计。节和节标题不应该表示托管对象,而是基于行对象的属性之一由行表示的托管对象的分组。你真正想要的是一个主 - 细节视图层次结构。顶部tableview将显示所有A
个对象。选择行时,它会加载第二个表视图,该视图显示与所选B
个对象相关的所有A
个对象。
答案 1 :(得分:1)
我会使用NSFetchedResultsController来监视A对象。使用提取的结果填充节标题。然后,当您要填充“数据行”时,可以找到当前的A对象(使用[[fetchedResultsController fetchedResults] objectAtIndex:indexPath.section]
或类似的东西)并使用A.BOjbects
从中提取B对象,这将返回NSSet与A对象关联的所有B对象。完成后,您可以在将列表放入行