问题标签 [nstreecontroller]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
402 浏览

cocoa - 具有异步数据的 NSBrowser / NSTreeController

我有一个 NSBrowser 需要显示来自 REST API 的数据。有时此 API 需要一段时间才能返回结果,因此最好在后台处理网络流量(延迟获取)。有时需要刷新子树以反映服务器端的更改。

我尝试了两种不同的方法:

  1. 使用 NSBrowserDelegate。当 [browserDelegate browser:child:ofItem:] 或类似函数最终请求尚未加载的数据时,我返回 0 计数并启动后台处理。当数据可用时,我重新加载了列(效率不高,随着新数据的进入,用户的选择会变得混乱)。
  2. 使用 NSTreeController。我使用阻塞/同步方法让它工作得很好。但是,每当我更新模型时,NSBrowser 都会重置树并将选择向上移动到父级。我试过 [obj mutableArrayValueForKey] 方法。我试过 [treecontroller insertObject:atArrangedObjectIndexPath:] 方法。我已经切换了“保留选择”标志。我切换了“插入时选择”。无论我做什么,NSBrowser 都不想只干净地更新相关的子树。

底线:将数据异步加载到 NSBrowser 的最佳实践是什么?

0 投票
0 回答
189 浏览

macos - 在 NSTreeviewController 中添加对象和子对象

我在 NSTreeviewController 课程中挣扎了 2 天。这是我的代码

我已将 TreeController Keypaths 添加为“孩子”。

实际上我的应用程序范围是想显示文件目录。如下

我已附上图片NSTreeview

那就是我想在这里显示取景器。

我该如何添加到这里。请帮忙。我在等待。提前致谢。对不起我弄错了英语

0 投票
1 回答
385 浏览

cocoa - 使用绑定填充 NSOutlineView - KVO 添加项目

在我的一个项目中使用它之前,我创建了一个小型测试项目来使用 NSOutlineView。我使用内容绑定到数组的 NSTreeController 成功地显示了带有子项的项目列表。

我的 NSTreeConroller 上的绑定

现在,当我创建这个对象时,我花了很长时间才意识到我的数组内容只有在我的 init 方法中创建它们时才会显示: - (id)init { self = [super init];

如果我将相同的代码放在 applicationDidFinishLaunching 中,它就不会显示这些项目。

尝试将项目添加到视图时,我现在面临同样的问题。我对使用 NSTreeController 的理解是,它处理的内容类似于 NSArrayController 对 NSTableView 所做的事情(OutlineView 是一个子类和全部)。但是,每当我使用符合 KV 的方法将项目添加到数组时,这些项目都不会显示在我的视图中。

添加对象后,我还尝试在大纲视图上调用 reloadData,但这似乎没有被调用。我错过了什么?

这是我的项目的链接:https ://dl.dropboxusercontent.com/u/5057512/Outline.zip

0 投票
1 回答
134 浏览

objective-c - 核心数据,从新创建的 NSManagedObject 填充强制关系

这应该很容易,能有多难。

我有一个基于文档的核心数据应用程序,具有非常简单的数据模型。

我有一个“节点”实体,它与自身具有父/子关系,由 NSTreeController 控制,并通过 NSOutlineView 查看。“节点”还与另一个由 NSArrayController 管理的实体类型“nodeProperties”具有非可选(对一个)关系。我有两个实体的 NSManagedObject 子类。我的文档类具有绑定到树控制器和数组控制器实例的出口。

我的问题是如何确保当大纲视图中的用户界面操作创建一个新的“节点”时,它与合适的(预先存在的)nodeProperties 对象的关系被填充。

我尝试过/考虑过的方法:

  1. 让树控制器创建“节点”(从其 add:、addChild: 操作)并在“节点”子类 awakeFromInsert 方法中填充与 nodeProperties 对象的关系。问题是我找不到从“节点”的 awakeFromInsert 中访问任何 nodeProperties 对象的方法。“适当的”nodeProperties 对象可从文档类中的一个方法获得,但从节点 awakeFromInsert 方法访问文档对象似乎违反了 MVC 的原则,并且我读过共享文档对象在拖动中并不总是安全的和删除操作(在我的例子中,它也创建了一个新的节点对象)

  2. 在文档类中编写 add: 和 addChild: 操作方法,并从最终用户操作而不是树控制器调用这些方法(我的拖放支持也在文档类中)。然后从这些方法中调用树控制器中的 add: 和 addChild: 方法,然后在新创建的节点上设置 nodeProperties 关系。问题是我不知道如何让树控制器给我一个新创建的节点的引用?我尝试使用 selectedObjects 方法获取父节点,然后比较添加前后的父子节点以获取新节点。但是此时儿童内容并没有改变——也许是延迟更新?

  3. 作为 2 的变体,根本不使用树控制器 add:/addChild: 方法,而是在文档中创建节点实体对象 add:/addChild: 方法,使用树控制器 selectedOjects 来获取父级。我真的不喜欢这样,因为它似乎在树控制器后面做一些事情,而且我必须 setContent: 每次创建根对象时。

  4. 我已经考虑过观察新创建节点的创建的可能性,但我不知道要观察什么来实现这一点。

以前一定有人做过这样的事情 - 但我拖网无济于事。非常欢迎所有帮助、建议和指导。

0 投票
1 回答
1156 浏览

objective-c - 如何在 NSOutlineView + NSTreeController 中获取所选节点的完整路径

在此处输入图像描述

我从这个链接中提到了 NSOutlineview 。我根据所选值动态加载所有值。在这里,我在获取路径时构造了一个问题。

比如,文件夹路径。(例如:D:/NewFolder/Test/blah/blah1

同样,我需要从父级获取完整路径选择的子级。在图像中,我选择了项目。所以我需要的路径应该如下所示,

我的代码是

我如何做到这一点。任何机构请帮助解决这个问题。提前致谢。

0 投票
1 回答
277 浏览

core-data - 样式化 NSOutlineView 行

我有一个基于文档的核心数据应用程序,其 NSTreeController 将内容提供给基于视图的 NSOutlineView。我正在“样式化”(设置文本颜色、背景颜色等)基于我的数据模型中的持久“可转换”NSColor 和 NSFont 属性的行,最终用户可以修改这些属性。当弹出新行时,它会使用数据模型中设置的颜色/字体显示内容。这是设置行背景颜色的委托/数据源代码:

但是,当样式属性更改时,我希望使用新样式值重绘关联的可见行。每次更改“样式”属性时,我都使用 NSNotificationCenter 向大纲视图委托发送通知,其中模型对象的行需要使用更改后的样式重新绘制。这是接收通知的委托中的代码。

我在这里的假设是我可以导航树控制器以找到代表我的模型对象的树节点,然后要求大纲视图重绘该树节点的行。这是树控制器中的“添加”代码,它遍历树以查找对象 - 效率不高,但我认为没有其他方法。

所以有时这有效并且行重绘,有时则无效。委托方法“styleHasChanged:”总是被调用,树控制器总是返回一个对应的树节点(实际上是NSTreeNode的一个子类)。但通常大纲视图无法识别树节点,并且不会重绘行。就像树控制器返回了与过去提供大纲视图的树节点对象不同的树节点对象。但奇怪的是,有时它确实有效,并且用新的背景颜色重新绘制了右行。如果我将该行折叠到视图之外并再次将其弹出,则它会正确重绘。

任何人都知道为什么它有时会起作用而不是其他时候吗?

能够以某种方式将颜色/字体属性绑定到行和列会很好,以便大纲视图使用 KVO 自动进行此样式设置,但我认为这是不可能的 - 是吗?

0 投票
1 回答
666 浏览

objective-c - 仅展开 NSOutlineView 中的根节点

我正在尝试解决一个简单的问题,即仅扩展NSOutlineView中的根项目但没有运气。我可以展开所有项目和选定项目,但我似乎无法弄清楚如何准确地确定如何仅扩展根节点。大纲视图显示文件夹树,我想显示根文件夹下可用的文件夹,但我不想展开文件夹子项。

我目前尝试设置我的 NSTreeController 的 selectionIndexPath ,然后在大纲视图中展开选择:

这不起作用。非常感谢有关如何正确解决此问题的建议。

干杯,特隆德

解决方案: 我已经拥有的和@PaulPatterson 建议的以下组合完美地工作:

0 投票
1 回答
128 浏览

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

我有一个基于核心数据的文档支持的应用程序,大量使用可可绑定。我正在使用 NSTreeController 来填充 NSBrowser。主要实体有一组孩子,可通过称为“孩子”的关系访问。添加孩子并在 NSBrowser 中显示它们没有问题。但是,在我保存文档并重新打开它之后,浏览器中只显示主要实体,而不是它们的子实体。我已经通过检查文件验证了孩子们与主要实体的正确关系(和反向)一起被保存。有没有其他人见过这个?是否有一些我可能遗漏的明显绑定/设置?

0 投票
0 回答
226 浏览

cocoa - 撤消对 NSOutlineView/NSTreeController 的移动节点的支持

我有一个NSOutlineView绑定到一个NSTreeController. 大纲视图的项目(多选)可以通过拖放重新排序。

我想添加对撤消/重做重新排序大纲视图的支持。有人可以指出一些示例代码来展示如何做到这一点吗?

我很难重建移动的树节点的索引路径,因为当我撤消更改时,树控制器的结构会发生变化,因此剩余节点的索引路径会放回其原始位置。

我最初使用此代码移动节点:

请注意如何moveNodes:仅将单个索引路径作为参数。如果选择包含多个节点,我不能一次将所有内容移回,而是必须一个一个地重播更改(遇到上述索引路径无效的问题)。

0 投票
1 回答
58 浏览

macos - NSTreeController 在删除节点时会产生延迟

我使用NSTreeController+NSOutlineView来显示一棵大树(超过 1K 节点)。树是用邻接表构造的。InNSTreeController开启了 LazyFetching。当我尝试删除一个节点NSTreeController时,开始满足所有故障后代节点。如果树很大,它会产生延迟。

完成日志如下:

这是正常行为吗?我该如何预防?