2

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

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

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

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

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

4

2 回答 2

1

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

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

于 2010-07-03T14:21:00.197 回答
0

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

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

于 2010-08-10T15:12:12.893 回答