2010-07-03 56 views
2

您可能知道,绑定到大纲视图的NSTreeController可以在呈现核心数据实体时显示重复项。NSTreeController显示重复实体的建议解决方案

临时解决方案是将“parent == nil”添加到谓词中,但这只会返回父实体。例如,如果用户正在搜索子实体,则不会显示所请求的子实体。 (提议的)解决方案是对NSTreeController进行子类化并添加一个NSMutableSet变量,用于跟踪当前正在显示的实体。这个变量应该在init上被分配,并在dealloc上释放。

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

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

如果有人有任何想法或反馈,请告诉我。提前致谢。

+0

您可能想要使用适当的术语来改述。 “实体”和“实体的实例”是两个不同的东西。我认为你的意思是“一个有自己亲子关系的实体的实例。”然而,你对“subentity”的用法是什么,这听起来像是“一个继承了来自父实体的属性/关系的实体”,这在这里没有多大意义。 – 2010-07-03 14:11:40

+0

对不起,不清楚。通过subentity,我的意思是一个实体的实例,它是另一个实体实例的子实体(就像您描述的关系一样)。 – 2010-07-03 19:37:55

回答

1

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

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

+0

我想这是一个用户界面问题,但我觉得它更像是一个底层读取问题。我真正想要做的是显示与谓词相匹配的所有实体实例,除了那些已经显示的其他实例的子实例。 (我想制作“智能”文件夹) 我想我可以限制搜索到根实例。你能推荐一种方法来维护单独的智能文件夹之间的分类吗? – 2010-07-03 19:49:08

0

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

我想(如约书亚说)如果你想筛选所有对象,你将不得不在NSTableView显示结果。