问题标签 [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 投票
2 回答
487 浏览

objective-c - 异构 NSTreeController

我有一个 NSTreeController(向 NSOutlineView 提供内容)。我希望顶级对象属于一个类,而所有其他对象(因此,任何级别的孩子)属于另一个。解决这个问题的最佳方法是什么?

我想我需要以某种方式改变至少add, addChild,insert和的行为insertChild。不过,我希望找到一种简单的方法来仅在一个位置解决此问题,而不是更改四种不同的方法。

0 投票
1 回答
926 浏览

cocoa - 如何在启动时为 NSTreeController 设置默认选择?

的背景

我在我的 Cocoa 应用程序中建立了一个源列表(类似于 iTunes 等)。

  • 我有一个 NSOutlineView,其 Value 列绑定到 NSTreeController 的排列对象.name 键路径。

  • NSTreeController 访问核心数据存储中的 JGSourceListNode 实体。

  • 我有 JGSourceListNode 的三个子类 - JGProjectNode、JGGroupNode 和 JGFolderNode。

  • 我已将 NSTreeController 上的 selectedIndexPaths 绑定到我的 App Delegate 中名为 selectedIndexPaths 的 NSArray。

在启动时,我搜索组节点,如果在核心数据存储中找不到它们,我会创建它们:

我想要的是

当我启动应用程序时,我希望扩展两个顶级组并突出显示“未训练”,如下所示:

我的窗口 http://synapticmishap.co.uk/Window.jpeg

问题

我将以下代码放在applicationDidFinishLaunching:应用程序委托的方法中:

但是大纲视图似乎还没有准备好,所以这段代码什么也不做。

理想情况下,最终我想保存用户所做的最后选择并在重新启动时恢复它。

问题

我确信可以使用一些疯狂的 KVO 来观察 NSTreeController 或 NSOutlineView 何时被填充,然后展开项目并更改选择,但这感觉很笨拙,太像一个解决方法。

我将如何优雅地做到这一点?

0 投票
1 回答
1449 浏览

osx-snow-leopard - addChild等使用NSTreeController和NSTreeNode(雪豹)

我有一个对象(OTNodeDatum)(OutlineTest 的OT)设置为NSTreeNode 中的表示对象。NSTreeNode 是 NSTreeController 的属性页面中显示的类。

我有基于文档的应用程序,没有核心数据。在 MyDocument init 上,我使用包含一个项目的 NSMutableArray 设置内容,一个 NSTreeNode 具有包含单个属性(是的,名称)的表示对象。

添加按钮,添加子按钮,删除按钮,通过接口构建器连接到 NSTreeController 添加操作等。

它在一定程度上起作用。

当我进行添加时,我会得到一个可以编辑的新空白行,但是当我离开单元格时,插入的文本会消失。

当我进行删除时,东西会被删除。

当我添加孩子时,什么也没有发生。

我认为我必须对 NSTreeNode 或 NSTreeController 进行子类化,以便在添加子节点和添加新的表示对象以及添加新的树节点方面获得正确的行为。

这是在正确的轨道上吗?如果我将 NSTreeController 子类化,我是否会覆盖添加 addChild 以使正确的事情发生?我能搞砸什么?尽管我已经花了很长时间寻找,但我似乎找不到任何关于此的指导。

谢谢。

约翰五世

0 投票
1 回答
988 浏览

cocoa - 当对象从 NSOperations 添加到托管对象上下文时,NSOutlineView 不刷新

背景

  • 使用核心数据的 Cocoa 应用程序 两个进程 - 守护进程和主 UI
  • 守护进程不断写入数据存储
  • UI 进程从同一数据存储中读取
  • UI 中 NSOutlineView 中的列绑定到 NSTreeController
  • NSTreeControllers managedObjectContext 绑定到 Application 的 key path 为 delegate.interpretedMOC
  • NSTreeControllers 实体设置为 TrainingGroup(NSManagedObject 子类称为 JGTrainingGroup)

我想要的是

当 UI 被激活时,大纲视图应该使用守护程序插入的最新数据进行更新。

问题

主线程方法

我获取所有我感兴趣的实体,然后迭代它们,执行 refreshObject:mergeChanges:YES。这工作正常 - 项目正确刷新。但是,这一切都在主线程上运行,因此 UI 在刷新时会锁定 10-20 秒。好的,所以让我们将这些刷新转移到在后台运行的 NSOperations。

NSOperation 多线程方法

一旦我将 refreshObject:mergeChanges: 调用移动到 NSOperation 中,刷新就不再起作用。当我添加日志消息时,很明显新对象是由 NSOperation 子类加载并刷新的。似乎无论我做什么, NSOutlineView 都不会刷新。

我试过的

我已经搞砸了 2 天,并尝试了我能想到的一切。

  • 将 objectIDs 传递给 NSOperation 以刷新而不是实体名称。
  • 在不同点重置解释的MOC - 在数据刷新之后和大纲视图重新加载之前。
  • 我将 NSOutlineView 子类化。我丢弃了我的子类并将视图重新设置为 NSOutlineView 的一个实例,以防万一这里发生任何有趣的事情。
  • 在重新加载 NSOutlineView 数据之前添加了对 NSTreeController 的重新排列对象调用。
  • 确保我已在我使用的所有托管对象上下文中将过时间隔设置为 0。

我有一种感觉,这个问题在某种程度上与在内存中缓存核心数据对象有关。但是我已经完全用尽了所有关于如何让它发挥作用的想法。

我将永远感激任何能够阐明为什么这可能行不通的人。

代码

主线程方法

NSOperation 多线程方法

更新 1

我刚刚发现了这个问题。在发布我的之前,我无法理解我是如何错过它的,但总结是:Core Data 并不是为了做我正在做的事情而设计的。只有一个进程应该使用数据存储。

NSManagedObjectContext 和 NSArrayController 重置/刷新问题

但是,在我的应用程序的不同区域中,我有两个进程共享一个数据存储,其中一个具有只读访问权限,这似乎工作正常。另外,我关于这个主题的最后一个问题的答案都没有提到 Core Data 不支持这一点。

I'm going to re-architect my app so that only one process writes to the data store at any one time. I'm still skeptical that this will solve my problem though. It looks to me more like an NSOutlineView refreshing problem - the objects are created in the context, it's just the outline view doesn't pick them up.

0 投票
2 回答
448 浏览

objective-c - NSTreeController 显示重复实体的建议解决方案

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

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

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

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

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

0 投票
1 回答
905 浏览

objective-c - 绑定到 NSTreeController selectionIndexPaths

我想通过执行以下操作以编程方式绑定到 NSTreeController 的 selectionIndexPaths(这样我就可以获得一个字符串选择并在文本视图中显示)

[activePDFView bind:@"name" toObject:treeController withKeyPath:@"selectionIndexPaths.nodeName" options:options];

树控制器绑定到一个 NSMutableArray,其中包含具有“nodeName”属性的对象。NSMutableArray 中的对象与属性“nodeName”的 KVC 兼容,因为我已经实现了正确的访问器。

当我编译时,我收到以下消息

'[<__NSArray0 0x1001698d0> addObserver:forKeyPath:options:context:] 不受支持。关键路径:nodeName'

我不太确定,但我的绑定是否正确?

谢谢。

0 投票
1 回答
414 浏览

objective-c - 以编程方式将核心数据实体中的项目放入 NSOutlineView?

抱歉,如果这看起来是一个愚蠢的问题 - 我是 Objective-C 和 Cocoa 的业余爱好者,而对于 Core Data 的使用则更不了解。

所以情况是这样的:我有一个 NSOutlineView,我已经使用 NSTreeController 手动填充了一些项目。我现在需要做的是获取我的核心数据实体之一中的项目并将它们附加到 NSOutlineView 的当前内容中。

显然,这超出了绑定的能力,因此需要以编程方式完成。我该怎么办?我假设我需要进行一次提取,然后遍历返回的项目,将每个项目添加到大纲视图中。它是否正确?如果是这样,任何人都可以展示如何做到这一点的例子吗?

谢谢!

0 投票
3 回答
1315 浏览

cocoa - NSTreeController 基于瞬态 isRoot 异常获取谓词

我的基于文档的 Cocoa 应用程序使用 NSOutlineView/NSTreeController 组合,绑定到文档的核心数据存储。我的 NSTreeController 有 fetch predicate isRoot == YESisRoot是一个瞬态布尔属性,默认值为NO. 我的根模型的awakeFromInsert调用:

[self setIsRoot:[NSNumber numberWithBool:YES]];

我可以很好地将对象添加到层次结构中,但是当我尝试加载刚刚保存的文档时,出现异常:

[<NSDictionaryMapNode 0x1001a8190> valueForUndefinedKey:]: this class is not key value coding-compliant for the key isRoot.

isRoot如果我在 xcdatamodel 中将属性更改为非瞬态,我可以解决此异常并成功加载新保存的文档,但根据我对瞬态标志的理解,它不应该引起问题,这真的不是应该持久化的数据类型。

我还尝试-isRoot在 NSManagedObject 子类中实现以返回适当的固定值,以及在setIsRoot:内进行相同的调用awakeFromFetch,但均无济于事。

我还缺少其他一些微妙之处吗?我无法想象 fetch 谓词不支持瞬态属性。我对 Core Data 的内部工作了解不多,但它试图查找isRoot特定于商店的类而不是我的 NSManagedObject 子类似乎很有趣。

0 投票
2 回答
2105 浏览

objective-c - 使用 NSTreeController/NSOutlineView 添加子对象

在我的应用程序中,与许多 Mac 应用程序一样,我有一个源列表。目前这是一个绑定到 NSTreeController 的 NSOutlineView。我可以很容易地向其中添加项目,甚至能够复制“源列表”外观,带有灰色的全大写标题和所有内容。不过,有些东西让我回避了,这让我发疯了。

如何将孩子添加到树中的特定项目?例如,假设我创建了一个名为“Cheese”的项目。我已经在 Cheese 中添加了两个孩子,分别称为“Cheddar”和“Swiss”。既然我的初始添加方法已完成运行,如何将“Longhorn Colby”添加到子列表中?

我用谷歌搜索了它,但找不到一个简单、直接的答案。不过,据我所知,它是不必要的复杂,类似于要求国会通过法案来做一些简单的事情,比如吃早餐。如果我错了,请纠正我。

更新:

我不相信我正在使用子类型。到目前为止,这是我填充树的方式:

“isSourceGroup”位用于表示该项目是大纲视图中的标题之一。

0 投票
1 回答
492 浏览

cocoa - Can NSOutlineView and NSTreeController handle thousands of objects?

Background

  • Core Data app on Snow Leopard 10.6.4 with GC

  • I've got an NSOutlineView backed by NSTreeController using bindings

  • I'm creating tens of objects on a background NSOperation subclass, saving and using mergeChangesFromContextDidSaveNotification to merge into the main context, all as recommended in the Apple docs

  • The main context has thousands of objects

The Problem

I've had lots of performance problems. Sometimes a merge can take a few seconds which locks up my UI. It also seems to use rather a lot of memory.

I recently found that others have had this issue too. I'm starting to think this is a restriction of the NSTreeController/NSOutlineView combination with bindings.

Questions

  1. Can NSOutlineView and NSTreeController handle thousands of objects efficiently?

  2. This post seemed to imply that this was an issue on 10.6.2 quoting rdar://7139579. Does anyone know if this has been "fixed"?

I'd greatly appreciate any suggestions.