问题标签 [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.
core-data - 你可以在视图之间传递一个 TreeController 吗?
我有一个标准的主从接口,我正在使用 Coredata 和可可绑定。
主列表使用 NSOutlineView 和 NSTreeController,这些项目保持静态,但不同的细节视图被换入和换出。
那么,如何设置数组控制器在不同细节视图中的内容,以对应Masterview中outlineview中的选择呢?
如果所有数组/树控制器都在同一个 .xib 文件中,这很简单。最初,我尝试从 Treecontroller 创建一个 Outlet,并在创建它们时将其传递给其他视图,但我认为这是不正确的。
有什么建议么?
objective-c - NSTreeController/NSOutlineView 失去选择
我正在开发一个桌面 Cocoa 应用程序。在应用程序中,我有一个基于视图的 NSOutlineView 绑定到 NSTreeController:
NSTreeController 处于实体模式,由 Core Data 驱动。一切都按预期工作,直到底层模型图发生变化。每当一个新对象插入到已注册的 NSManagedObjectContext 中时,NSTreeController 都会刷新其内容,并且绑定的 NSOutlineView 会正确显示结果。控制器的内容使用 NSSortDescriptor 按“标题”排序,我在应用程序启动期间设置了此排序。唯一的缺点是即使在 NSTreeController 的首选项中选中了保留选择框, selectionIndexPath 也不会改变。我想保留在新节点出现在树中之前选择的对象上的选择。
我将 NSTreeController 子类化以调试在对象图更改期间选择发生的情况。我可以看到 NSTreeController 通过 KVO 更改了它的内容,但setContent:
没有调用该方法。比setSelectionIndexPaths:
通过 NSTreeControllerTreeNode KVO 调用但参数包含先前的 indexPath。
所以,要清楚:
- 顶级 1
- 文件夹 1-1
- 文件夹 1-2
- 顶级 2
- 文件夹 2-1
- *文件夹 2-3 <== 已选择
- 文件夹 2-4
在初始阶段选择“文件夹 2-3”。然后将“文件夹 2-2”插入到 NSManagedObjectContext 中[NSEntityDescription insertNewObjectForEntityForName:@"Folder" inManagedObjectContext:managedObjectContext];
:
- 顶级 1
- 文件夹 1-1
- 文件夹 1-2
- 顶级 2
- 文件夹 2-1
- *文件夹 2-2 <== 已选择
- 文件夹 2-3
- 文件夹 2-4
我想保留“文件夹 2-3”上的选择,因此我设置了“Preseve 选择”,但似乎 NSTreeController 完全忽略了这个属性,或者我误解了一些东西。
我怎样才能强制 NSTreeController 保持它的选择?
更新1:
不幸的是,我的 NSTreeController 子类中从未调用过任何突变方法(insertObject:atArrangedObjectIndexPath:
等)。insertObjects:atArrangedObjectIndexPaths:
我已经覆盖了大多数工厂方法来调试引擎盖下发生的事情,这就是当新的托管对象插入上下文时我可以看到的:
FoldersTreeController 处于实体模式并绑定到 Application 委托的 managedObjectContext。我有一个名为“Folders”的根实体,它有一个名为“children”的属性。它与称为子文件夹的其他实体是一对多的关系。Subfolders 实体是 Folders 的子类,因此它具有与其父级相同的属性。正如您在第一个附加屏幕截图中看到的那样,NSTreeController 的实体已设置为文件夹实体,并且按预期工作。每当我将新的子文件夹插入 managedObjectContext 时,它就会出现在正确文件夹下的树中(作为子节点,由绑定到 NSTreeController 的 NSSortDescriptor 排序),
我可以看到该setContent:
方法在应用程序启动期间被调用,但仅此而已。似乎 NSTreeController 观察根节点(文件夹)并通过 KVO 以某种方式反映模型更改。(因此,当我创建一个新的子文件夹并将其添加到其父文件夹时,[folder addChildrenObject:subfolder]
它出现在树中,但没有调用任何树突变方法。)
不幸的是,我不能直接使用 NSTreeController 变异方法(add:
, addChild:
, insert:
, insertChild:
),因为真正的应用程序会在后台线程中更新模型。后台线程使用自己的 managedObjectContext 并将更改与mergeChangesFromContextDidSaveNotification
. 这让我抓狂,因为一切正常,期待 NSOutlineView 的选择。当我将一堆子文件夹从后台线程合并到主 managedObjectContext 时,树会自行更新,但是我丢失了在合并之前选择的对象的选择。
更新2:
我准备了一个小样本来演示这个问题:http ://cl.ly/3k371n0c250P
- 展开“文件夹 1”,然后选择“选择子文件夹 9999”
- 按“新建子文件夹”。它将在后台批量创建50个子文件夹。
- 如您所见,即使在 MyTreeController.m 中的内容更改之前保存了选择,“子文件夹 9999”中的选择也会丢失
objective-c - 从 NSTreeNode 在 NSoutlineView 上显示内容
我想在NSOutlineView
. 我有一个NSTreeNode
with 数据,但我不知道如何NSTreeNode
在一个NSOutlineView
.
我浪费了很多时间在谷歌上搜索购买我找不到任何可以满足我要求的东西。有人可以帮助我吗?
cocoa - 更改树中的节点后将重新排列对象发送到 NSTreeController 的正确方法?
在更改树中的节点后,将重新排列对象发送到 NSTreeController的适当方法是什么?我有一个示例应用程序(下面的完整代码),它使用 NSOutlineView 和 NSTreeController 以及一个简单的 Node 对象树。
在应用程序的版本 1 中,当您编辑节点的名称时,直到您单击列标题或使用菜单中的“重新排列”项,树才会重新排列。后者设置为直接将重新排列对象发送到 NSTreeController。
在版本 2 中,我尝试从节点的 setName: 方法发送重新排列对象。这似乎不是一个好的解决方案,因为这意味着模型现在已经了解了视图/控制器。此外,它的副作用是大纲视图在重命名后失去焦点(如果您选择一个节点并编辑其名称,选择栏会从蓝色变为灰色)出于某种原因(为什么会这样?)。
NSArrayController 有一个方法setAutomaticallyRearrangesObjects:但是 NSTreeController 没有?那么解决这个问题的适当方法是什么?
objective-c - 无法执行操作,因为 childrenKeyPath 为 nil
当我尝试将孩子插入我的NSTreeController
.
Xcode 说:
* 由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“[对象类:NSMutableDictionary] 无法执行操作,因为 childrenKeyPath 为 nil”*
为什么会导致此错误?什么是 childrenKeyPath,我为什么需要它(我没有使用界面生成器)?
macos - 设置 NSTreeController 的容量?
在我的 OSX 应用程序中,我使用 anNSTreeController
来跟踪对文档的任何更改。树控制器通过充当源代码控制来启用版本控制,这意味着文档可以创建自己的分支等。
到目前为止它工作正常。问题是对文档的每次更改都会NSTreeNode
在树中添加一个。这意味着经过几个小时的使用,树已经积累了许多节点,这意味着内存中有大量的对象。
有没有一种方法可以创建一个具有自动修剪子节点NSTreeController
的容量(就像你给 an 一样)?NSArray
如果不是,那么以适当的时间间隔手动刷新节点以使内存使用不会膨胀的最佳方法是什么?
cocoa - 如何编辑 NSOutlineView 项目
我有一个使用 NSTreeController 的 Outlineview,在大多数情况下,除了添加新项目时,一切都按我的意愿运行,我希望自动选择项目进行编辑。在过去使用 NSTableview 时,我会确定项目所在的行并使用该函数
但是,由于 NSOutlineView 使用 NSindexPath,我正在为如何实现这一点而苦苦挣扎,所以是否有一个函数可以传递 NSIndexpath 而不是一行来实现相同的结果。或者我应该对 NSOutlineView 有不同的方法。
objective-c - NSTreeController addChild: 不调用 newObject 但 add: 调用 (Class/Object 模式)
我注意到我的子类 os NSTreeControllernewObject
仅在add:
调用该方法时运行,但从不运行addChild:
我发现这个线程讨论了同样的问题。虽然在这种情况下,用户在核心数据模式下使用树控制器,但是我已经设置为使用特定的类(对象模式)。
addChild:
不使用该newObject
方法的原因是什么?
如果newObject
被要求,add:
我看不出它为什么不适合addChild:
. 我在 Apple 的 SourceView 演示应用程序中确认了这种行为,方法是将 OutlineController 替换为子类,并将按钮连接到add:
并且addChild:
- 再次仅add:
调用newObject
. 我发现这真的真的很奇怪的行为。
objective-c - NStreeController - NSoutlineView 获取单元格绑定对象
我在 a 中有以下场景NSoutlineView
:
每个复选框都有一个绑定设置为NSTreeController
. 当用户选择 parentObject 复选框时,还应设置相应的子复选框。但是,当设置子对象复选框时,不应影响父复选框。我似乎无法让父功能正常工作。
我目前尝试解决的问题是:设置复选框时调用:
但是,根据我的研究,我无法找到一种方法来访问NSTreeController
.
对这个问题的任何见解将不胜感激。我觉得这是人们在使用 NStreeController 时会遇到的常见问题,我很好奇我是否采取了正确的方法。
谢谢 :)
objective-c - 从 NSTreeController 中删除所有项目
我想清除使用 Controller.AddObject 添加的 NSTreeController 中的所有项目。这可能吗?我认为可以检索所有索引路径,按深度反向排序并逐个删除项目,但我希望有一种方法来清除数据。