我正在尝试制作一个 Core Data 应用程序,在该应用程序中,当您在 TableView 中选择一个“玩家”时,所有队友的列表会出现在第二个 tableView 中,并有一列显示这两个玩家在同一个游戏中玩了多少次“团队”(另一个实体)。
这让我完全陷入困境,因为虽然我知道如何从普通数组中填充表格,但使用 ArrayControllers 和 Core Data 确实让我对这种情况的看法变得混乱。
你会如何处理这个问题?
我正在尝试制作一个 Core Data 应用程序,在该应用程序中,当您在 TableView 中选择一个“玩家”时,所有队友的列表会出现在第二个 tableView 中,并有一列显示这两个玩家在同一个游戏中玩了多少次“团队”(另一个实体)。
这让我完全陷入困境,因为虽然我知道如何从普通数组中填充表格,但使用 ArrayControllers 和 Core Data 确实让我对这种情况的看法变得混乱。
你会如何处理这个问题?
您的问题是绑定问题,而不是核心数据问题。:-)
在处理 Core Data 之前,您绝对应该掌握Cocoa Bindings 。这在文档中有所说明,并且非常真实。
你问题的主题似乎与正文不同,所以我会同时回答。
显示队友
除了核心数据,假设您有一个代表 Player 实例的表。玩家有一个团队。球队有很多球员。因此,推断 Player 的一个实例有“team.players”(减去它自己)作为队友。无论您是否使用 Core Data 来管理模型,整体关系都是如此。
如果您通读并掌握 Cocoa Bindings,您会发现使用基本的Master/Detail设置(为简单起见,为 Detail 部分使用额外的数组控制器)设置并不难。您的 Master 数组控制器代表所有 Player 实例,而您的 detail 数组控制器代表 Teammates - 或 Master 选择的“team.players”(减去自身)。
Teammates 数组控制器将照常设置其实体和托管对象上下文(请参阅文档)。“contentSet”将绑定到主阵列控制器的“选择”控制器键,“team.players”作为模型键路径。
诀窍是使用predicates过滤掉主控制器的选定玩家。您可以使用数组控制器的Filter Predicate来做到这一点。也许一个格式为“self != %@”,其中“%@”代表主阵列控制器的选择。我将把谓词(一个复杂的话题本身)留给你。请记住,您可以在代码中设置它们([myController setFilterPredicate:myPredicate])或使用绑定。谓词也独立于核心数据。
获得选择
由于阵列控制器负责表所代表的阵列,因此最好询问阵列控制器它的选择是什么。一种方法是向其 -arrangedObjets 询问其 -selectedIndexes 处的对象。
NSArray * selectedObjects = [[myArrayController arrangedObjects] objectsAtIndexes:[myArrayController selectedIndexes]];
您也可以向它询问 -selectedObjects。您绝对应该理解的文档(API 参考和概念文档)描述的这两种方法之间存在差异,但是询问控制器是最重要的概念,无论您使用的是 NSArrayController 还是某些符合以下要求的自定义控制器和协议。
免责声明: 在社交清酒之夜后匆忙输入。不检查错误。:-)