核心数据:在NSTableView中排序到多个关系

时间:2010-08-02 12:24:27

标签: objective-c cocoa sorting core-data nsarraycontroller

我遇到麻烦让我的NSTableView保持订购多对多关系的内容。

我所拥有的是与NSArrayController管理的实体“Card”的多对多关系中的实体“关系”。 Card有2个属性,“number”(int)和“name”(String)通过NSTableView的两列中的Bindings显示。我可以永久地对表列进行排序,但是在卡的每个新插入中,表视图的行都会随机重新排列(但是,删除卡会保持行顺序)。

我想要的是以下行为:用户可以对列进行排序,但是当他插入卡片时,卡片应显示为表格的最后一行(不会在插入时直接排序,但当然不会显示随机重新安排,或)。只有当用户再次排序时,新卡才会被排序。

我知道多对多关系的内容会被保留为集合,但我不知道如何从那里开始。

我感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

如果表的列绑定到NSArrayController,那么行的顺序永远不应该是随机的,因为数组具有固定的顺序。此外,数组控制器使用的提取应该有一个排序描述符,它将强制执行排序顺序。

随机化表示您将某个集映射到数组的某个位置。 (集合以随机顺序包含唯一对象。)

顺便说一句,在表的末尾放置一个新添加的排序很难实现,并且UI设计很糟糕。

这很难实现,因为Core Data和绑定旨在轻松准确地显示数据,而不是UI中任意可视的位置。如果表的末尾没有添加Card对象的逻辑含义,那么你将需要做很多工作才能使它显示在那里。

这是糟糕的用户界面,因为当所有其他卡以某种逻辑顺序出现时,用户将无法理解为什么新添加的卡会出现在表的末尾。如果您在名称上按字母顺序排序表,则用户将无法理解为什么名称为“Foxtrot”的卡片出现在“Zulu”之后的表格末尾。

相反,您应该在表格外部的UI元素中显示新卡片和/或将表格滚动到新卡片的正确排序位置。

答案 1 :(得分:0)

基本上,您需要在已排序的NSArray中缓存关系集。

创建一个NSArray,它是NSSet与[fooSet allObjects]的关系的一个版本。 NSArray有几种排序方法可用于对内容进行排序。当用户添加新卡时,将其添加到数组的末尾并将其添加到父对象关系。