2010-08-02 57 views
0

我有麻烦让我的NSTableView保持多对多关系的内容排序。核心数据:NSTableView中的排序多对多关系

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

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

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

我很感激任何帮助。

回答

0

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

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

+0

非常感谢您的回答!由于我是核心数据的初学者,我不确定你提到的逻辑部分属于哪里。你能否更具体一点关于在哪里缓存关系集以及如何将它重新添加到父对象关系? – Core 2010-08-02 12:55:01

1

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

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

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

实现起来很困难,因为核心数据和绑定旨在以逻辑关系轻松准确地显示数据,而不是UI中的任意可视位置。如果表的末尾没有添加Card对象的逻辑含义,那么您将不得不做很多工作才能使其显示在那里。

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

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

+0

感谢您的回答。在我使用核心数据时,我将Card实体的NSArrayController绑定到Category实体的NSArrayController的ContentSet,从而形成一对多的关系。绑定到ContentArray是不可能的! 因此,(我想)NSTableView呈现的是一个集合。通过点击表头(列被绑定到卡片的属性),表格被正确排序。但是,在插入新卡时,行开始跳跃。 (这与我是否希望将卡添加到表的末尾无关) – Core 2010-08-02 14:06:30