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

Posted

技术标签:

【中文标题】NSTreeController 显示重复实体的建议解决方案【英文标题】:Proposed solution to NSTreeController displaying duplicate entities 【发布时间】:2010-07-03 00:50:46 【问题描述】:

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

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

一个(建议的)解决方案是继承 NSTreeController 并添加一个 NSMutableSet 变量,它跟踪当前正在显示的实体。此变量应在 init 时分配,并在 dealloc 时释放。

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

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

【问题讨论】:

您可能需要使用适当的术语重新表述。 “实体”和“实体的实例”是两个不同的东西。我认为您的意思是“与自身具有父/子关系的实体的实例”。但是,您对“子实体”的使用听起来像是“从父实体继承属性/关系的实体”,在这里没有多大意义。 抱歉不清楚。子实体是指一个实体的实例,它是另一个实体实例的子实体(正如您描述的关系)。 【参考方案1】:

公平地说,您真的在寻找一种方法来使用搜索词过滤树而不丢失树结构吗?固有的问题(除了强制树控制器包含搜索匹配的父节点之外)是父节点实际上可能匹配也可能不匹配搜索结果,因此显示它们会造成混淆。

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

【讨论】:

我想这是一个 UI 问题,但我觉得它更像是一个潜在的获取问题。我真正想做的是显示与谓词匹配的所有实体实例,除了已经显示的其他实例的子实例。 (我想制作“智能”文件夹)我想我可以将搜索限制为根实例。您能推荐一种在单独的智能文件夹之间保持排序的方法吗?【参考方案2】:

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

我认为(就像 Joshua 所说的那样)如果您想过滤所有对象,则必须在 NSTableView 中显示结果。

【讨论】:

以上是关于NSTreeController 显示重复实体的建议解决方案的主要内容,如果未能解决你的问题,请参考以下文章

观察 NSTreeController 绑定的核心数据实体以进行插入/删除

具有两个不同核心数据 NSManagedObject 实体的 NSTreeController

NSTreeController/NSOutlineView 失去选择

通过核心数据加载文件后,NSBrowser 不会从 NSTreeController 重新填充子项

如何将 NSTreeController 的孩子绑定到订购到多关系的核心数据?

如何将 NSTreeController、NSOutlineView 和 Core Data 与“不可见”的根项一起使用?