NSTreeController的建议解决方案显示重复的实体

时间:2010-07-03 00:50:46

标签: objective-c cocoa core-data nsoutlineview nstreecontroller

许多人可能知道,绑定到大纲视图的NSTreeController可以在呈现核心数据实体时显示重复项。

临时解决方案是将'parent == nil'添加到谓词中,但这只返回父实体。例如,如果用户正在搜索子实体,则不会显示所请求的子实体。

(建议)解决方案是子类NSTreeController并添加一个NSMutableSet变量,该变量跟踪当前正在显示的实体。这个变量应该在init上分配,并在dealloc上发布。

当调用“fetchWithRequest:merge:error:”时,该集应该被清空(我不确定这是否比释放它并再次分配它更有效)。每次要添加实体以进行显示时,请检查该组是否包含该实体。如果没有,请添加它。否则,找到哪个更接近根(这是子实体),如果是子实体则跳过它,或者将其与之前包含的实体交换。

我认为对性能的影响相对较小(考虑到NSS​​et使用散列)。我遇到的问题是找到正确的方法来覆盖以添加此行为。具体来说,在调用“fetchWithRequest:merge:error:”之后,NSTreeController处理获取的实体。

2 个答案:

答案 0 :(得分:1)

说你真的在寻找一种用搜索词来过滤树而不会丢失树形结构的方法,这是否公平?固有问题(除了强制树控制器包括搜索匹配的父节点)是父母可能实际匹配或不实际匹配搜索结果,因此显示它们会让人感到困惑。

我认为你的UI更是一个问题,不是吗?在这种情况下,最好的方法(我见过许多知名公司和独立开发人员采用的方法)是在普通表中显示搜索结果。这样,结果可以按各种属性进行排序,并且您不必在搜索模式下禁用大纲视图中的拖放(以避免用户在仅显示部分树的情况下尝试更改树结构时)。

答案 1 :(得分:0)

扩展Joshua的答案,我能够将搜索功能实现到我自己的NSOutlineView中,但它仅限于视图中的根/父对象。

我认为(如约书亚所说)如果你想过滤所有对象,你必须在NSTableView中显示结果。