使用 NSTreeController 过滤 NSOutlineView 的子项

Posted

技术标签:

【中文标题】使用 NSTreeController 过滤 NSOutlineView 的子项【英文标题】:Filtering children of NSOutlineView with NSTreeController 【发布时间】:2016-06-07 09:39:42 【问题描述】:

我正在开发一个使用核心数据的 Mac 应用程序。我正在使用 NSOutlineView 和 NSTreeController 在视图上绑定数据。

你可以假设我的数据结构为

父项 1 子项 1 子项 2 子项 3 父项 2 子项 4 子项 5

我将 fetchPredicate 应用到我的 NSTreeController 以成功过滤数据。另一方面,fetchPredicate 仅适用于第一级数据(适用于父项)。

我需要一个可以将 fetchPredicate 也应用于子项的方法。例如,如果我的条件与子项 1 和子项 4 匹配,则结果应为

父项 1 子项 1 父项 2 子项 4

任何帮助将不胜感激。

【问题讨论】:

那么您的问题到底是什么?您在过滤子项方面遇到的困难是什么? 感谢您的回复。正如我在问题中提到的,我将 filterPredicate 应用于 NSTreeController。例如 NSPredicate(format: due_on = 您正在应用提取谓词。 NSTreeController 不支持过滤谓词。 NSTreeController 获取顶层对象并使用子关系来获取子对象。如果你想过滤孩子,你必须做一些编程。 @Willeke 感谢您的回复。我可以进行任何编程,但在 NSTreeController 从核心数据创建子节点时找不到中断点。 在 SO 中搜索“NSTreeController 过滤器”。 【参考方案1】:

您正在应用 fetch 谓词。 NSTreeController 不支持过滤谓词。 NSTreeController 使用 fetch 谓词来获取顶层对象并使用子关系来获取子对象。不获取子级,也不使用 fetch 谓词来获取子级。

解决方案 1:实现计算属性 filteredChildren,如在此问题中:Filtering A Tree Controller 并在此无关答案中提到:Is it possible to bind an NSTreeController to an NSOutlineViewDataSource?

解决方案 2:使用数据源而不是绑定,在上面的答案中也提到过。

【讨论】:

解决方案 1 是完美的。谢谢

以上是关于使用 NSTreeController 过滤 NSOutlineView 的子项的主要内容,如果未能解决你的问题,请参考以下文章

将非模型节点添加到 NSTreeController

CoreData、SourceList 和 NSTreeController

NSOutlineView 和 NSTreeController 可以处理数千个对象吗?

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

NSTreeController/NSOutlineView 失去选择

检索所有 NSTreeController 的对象