问题标签 [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.
objective-c - CoreData 和 NSTreeController
目前,我坚持使用作为核心数据后端的 nstreecontroller。我的问题是,如果我编辑字段或添加新行,则不会触发重新排列。
结构:
- NSTreeController 配置为开启准备内容并使用延迟获取。控制器绑定到 appDelegate.managedObjectContext 和 appDelegate.mySortDescriptor(这是一个返回数组的函数,其中包含 nssortdescriptor)。
- Outlineview 将其列绑定到 treecontroller.arrangedObjects.name。Outlineview 也处于 SourceList 模式。
- 一个名为“Item”的实体,它与 Item 具有一对多关系(子级)和与 Item 的一对一关系(父级)。当然,还有一个名为“name”的字段保存显示值。
- 两个存储。一个只保存在内存中,一个是默认的。临时存储用于设置根实体(我不希望它们被存储,因为它们只是“视觉”)
直到这里一切都很好,除了:
- 在启动时 sortdescriptor 被读入但未执行(我称自己为重新排列函数)
- 核心数据无修改触发重排方法
我已经尝试通过以下结果自行解决问题:
- 删除“使用延迟提取”将解决问题 o_O 但谁想要呢?!
- 在 outlineView:setObjectValue:forTableColumn:byItem: (outlineview 数据源) 中调用重新排列将解决问题。但我真的不明白为什么会调用它(我正在使用 coredata,所以它不应该被调用?)。另一方面,调用重新排列经常会再次弄乱排序(例如,如果您保存一个未更改其值的单元格)
这就是为什么我告诉自己你必须面对你做错事的事实:)
我真正想要的是以下内容:
- 核心数据后端
- Outlineview 总是排序的(用户不能改变它)
- 跳过根对象的保存
- 减少工作总是受欢迎的
非常感谢和最好的问候,马蒂厄里奥洛
PS:提示也很受欢迎
objective-c - 如何有效地展平 NSOutlineView?
我有一个绑定到我的 NSTreeController 的 NSOutlineView。NSTreecontroller (myTreeController) 的内容使用以下命令设置数据: [self.myTreeController setContent:self.myArrayOfFiles]; 数组的内容由使用 NSTreeNode 子类 (TKnode) 添加的 NSTreeNode 父对象和子对象组成:
[TKnode treeNodeWithRepresentedObject:myRootObject]
.
这很好用,可以正确显示我的 NSoutlineView。但是当我想遍历 NSOutlineView 的内容时,我需要将其展平并将对象存储在一个数组中。这是我需要一些帮助的地方,因为我拥有的解决方案不是最佳的并且可能容易出错。
我首先使用以下方法返回 NSTreeController 的内容:
这将返回一个包含树结构的大小为 1 的 NSTreeControllerTreeNode 数组。然后我使用 childNodes 方法访问树结构的第一层。
使用以下方法递归访问子项的子项:
这有效并返回一个数组,其中包含我的所有对象,而不是 NSTreeNode,而是我感兴趣的对象。但似乎很容易出错,我有时必须在对象上调用两次代表对象才能访问我的对象。这是我应该使用 NSTReeController 和 NSTreeNodes 的方式吗?有没有更好的办法?我首先想使用 NSTreeNode 和 NSTreeController 的原因是为了免费获得一些已经实现的方法,例如排序和排列对象,我习惯于使用 NSTableView。但是我用来访问 NSTreeController 内容的方法似乎不正确?我应该使用arrangedObjects
来获取 NSTReeController 的内容还是应该使用不同的方法?非常感谢任何有关如何正确展平 NSOutlineView 的建议。
谢谢!干杯,特隆德
cocoa - 视图选择更改时,自定义 NSViewController 表示对象不会更新
我有一个自定义的 NSViewController,它也是一个 NSOutlineViewDataSource。我还有一个窗口,其中 NSOutlineView 绑定到我的视图控制器的实例作为数据源,并且 NSOutlineView 绑定到视图:自定义视图控制器的属性。
控制器很好地填充了大纲视图。但是,视图中的选择不会自动更新控制器的代表对象属性。唯一似乎触发了表示对象变化的事情是当我直接调用 setRepresentedObject: 时......这有点违背了目的。
知道为什么会这样吗?代表对象应该自动更新,对吗?提前致谢...
cocoa - 是否可以将 NSTreeController 绑定到 NSOutlineViewDataSource?
我有一些分层数据模型,我想在 NSOutlineView 中呈现。我将树控制器绑定到大纲视图以提供数据并处理选择和绑定到其他视图。
但是,我只想将模型中的部分数据显示到大纲视图中。(我的层次结构中的每个对象都有一个子对象数组,但我只希望这些子对象中的一些显示为树中节点的子节点。)我希望我可以将过滤谓词附加到树控制器,但似乎 NSOutlineView 不支持过滤谓词。
我认为这种设计需要一个 NSOutlineViewDataSource 来过滤我的数据模型,以及一个绑定到数据源和大纲视图的 NSTreeController。但是,树控制器中的绑定出口(内容数组、内容对象、内容集等)似乎都不适合绑定数据源。
有任何想法吗?提前致谢...
cocoa - 有什么方法可以将代码附加到 NSTreeController / NSOutlineView 选择更改事件?
我有一个简单的 NSOutlineView 绑定到一个 NSTreeController ,它提供对我的分层数据模型的访问。我想让它成为一个主/详细视图,并在某些绑定视图中显示有关所选节点的一些信息。但是,我遇到了一堆死胡同:
1) NSOutlineView 的文档是这样写的:
一些委托方法尚未迁移到 NSOutlineViewDelegate 协议,包括:
大纲视图SelectionDidChange:
大纲视图选择变化:
...这几乎正是我想要捕获的事件。尽管文档没有注明日期,但我认为我应该将“尚未迁移”理解为“不要屏住呼吸”。
2) 将大纲视图附加到 IBOutlet 提供了一些选择事件处理 - 但仅在单击鼠标时。使用键盘光标键导航层次结构不会产生任何事件。
3) NSTreeController 似乎没有为这个非常基本的功能提供任何支持。
所以......我错过了什么吗?或者有没有比继承 NSTreeController 更简单的方法来完成这个任务?
提前致谢...
objective-c - 如何使用 NSTreeController 正确显示枚举对象
我试图了解如何使用 NSTreeController。当我添加了一个方法(下面提供了SourceView示例的类和方法的片段)来迭代目录的内容时,它通过NSTreeController传输到NSOutlineView。但是, NSOutlineView 仅显示第一个对象(根对象)(您可以在下面的方案中看到它)。
类 NSTreeController 方法:
显示目录枚举对象的方法:
我的错误可能是 NSTreeController 没有区分简单对象(文件)和目录(文件夹)。
但是,当我在没有 NSTreeController 的情况下填充 NSOutlineView 时,所有内容都正确显示:
注意:如果使用 addFolder 方法:(在 SourceView 示例中,它用于为其他对象创建父组)然后,每个下一个对象显示为前一个的子组。
您能帮我正确显示这些方法中的文件夹内容吗?
objective-c - 更新 NSOutlineView 的内容
我有一个 NSOutlineView 显示由 NSTreeController 控制的内容,我将其绑定到 NSMutableArray (arrayOfFiles)。该数组包含 NSTreeNode 对象,其中代表对象(Fileobject 类)包含许多 ivars。我想为特定对象编辑和更新名为“direction”的 ivar。我设法使用为每个对象存储的 NSIndexPath 来获取我感兴趣的对象。
这很好用,但是当我想更新刚刚在 NSIndexPath 提取的对象时遇到了问题。以下崩溃:[self.myOutlineViewController.myTreeController removeObjectAtArrangedObjectIndexPath:myIndexPath];
带有错误消息
我知道我在这里的键值编码做错了,但我看不到它是什么。我试图在 Apple 的所有示例中寻求解决方案,但我只能找到不使用 NSTreeController 和 NSTreeNode 的示例。我的想法是 1)在 indexpath 处提取对象 2)编辑提取的对象 3)在 indexpath 处删除当前对象 4)使用 command 将我新编辑的对象插入 indexpath 中[self.myOutlineViewController.myTreeController insertObject:myNode atArrangedObjectIndexPath:myIndexPath];
。当我不只替换 ivar 而是替换整个对象时,我看不到如何使用键值编码替换我的对象?
任何关于我做错了什么的建议以及关于我如何解决这个问题的建议都非常感谢。
干杯,谢谢!特隆
cocoa - NSComboBox 绑定到 NSTreeController
我有一个带有孩子的 NSTreeController/NSOutlineView 和一个 NSComboBox。我只想在组合框中显示顶级对象而不是子项。无法弄清楚如何做到这一点。有什么建议么?
cocoa - 使用 CoreData 为 NSOutlineView 设置 NSTreeCcontroller
我的模型如下所示:
在我的测试项目中,我有以下两种方法:
这会产生一个大纲视图,如下所示:
对于 xib 中的树控制器对象,我已将 Children Key Path 设置为“children”。托管对象上下文 (moc) 绑定到文件所有者 moc。我的大纲视图的表列的值绑定到 NSTreeController 的排列对象,模型键路径为“名称”。
如您所见,当子项只应出现在根项下时,我得到了子项的重复条目。
我究竟做错了什么?
示例项目位于示例项目链接。
谢谢你。
cocoa - NSOutlineView/NSTreeController 删除后没有释放所有模型对象
我有一个非常基本的应用程序:一个NSOutlineView
绑定到NSTreeController
. 大纲视图显示一个简单的模型对象 ( TCCard
)。我添加了两个按钮,以便可以在大纲视图中添加和删除模型对象。
查看 Instruments (Leaks) 中的应用程序,我可以看到我的模型对象的新实例是在我添加它们时创建的,但当我从大纲视图中删除它们时,并不是所有实例都被释放。即使大纲视图没有更多条目,我的模型对象的两个或三个实例也始终保持“活动”状态。
大纲视图或树控制器是否在幕后进行一些缓存?下面的代码:
这是一个非常基本的例子。在我的真实应用程序中,这些模型对象非常“沉重”,并有很多对其他对象的引用。我真的希望在将它们从视图中删除时将它们全部释放。
编辑:即使使用 Apple 的示例代码也可以重现此问题:https ://developer.apple.com/library/mac/#samplecode/DragNDropOutlineView/Introduction/Intro.html#//apple_ref/doc/uid/DTS40008831
在 Instruments 中的示例中运行并搜索SimpleNodeData
. 观察实例的数量,然后从示例应用程序中删除所有节点(通过上下文菜单)。