观察 NSTreeController 绑定的核心数据实体以进行插入/删除
Posted
技术标签:
【中文标题】观察 NSTreeController 绑定的核心数据实体以进行插入/删除【英文标题】:Observing NSTreeController's bound CoreData entities for insertion/removal 【发布时间】:2009-08-27 09:40:56 【问题描述】:我正在创建自己的可绑定自定义树视图。为此,我想观察 NSTreeController 以更新其项目的多对关系。 NSTreeController 绑定到 CD 托管对象上下文。每个深度级别都有自己的 CD 实体,带有 parent/children/isLeaf 属性。我需要在视图中保持相同的层次结构(以及子项的顺序)。如果插入了某些东西,我将开始观察它的 children 属性。我当然需要知道新插入对象的索引路径。
我想确切地知道插入/删除了什么,所以我可以开始观察它的子项插入/删除。据我了解,执行此操作的标准方法是查看 observeValue:forKey... 中的“更改”NSDictionary...,但更改为 NULL。
我知道这是一个长期存在的错误,但有什么好的解决方法吗?我已经看到一些示例的视图保存数组,然后当模型更改时,您比较差异。树视图更复杂。这种方式也会浪费内存和 CPU 周期。 我有一个正在测试的解决方法。它只是一种工作,所以我不会描述它。
【问题讨论】:
你有没有为此想出一个不错的解决方案?我遇到了同样的问题。 【参考方案1】:如何继承 NSTreeController 并实现其插入/删除方法。比如这样的事情。
- (void)insertObject:(id)object atArrangedObjectIndexPath:(NSIndexPath *)indexPath
// ... code to update your object relationships ..
// ... Take care here if you update any variables in your model (eg a sortindex) that would trigger KVO in the NSTreeController. In those case you need to make the updates without triggering KVO by using setPrimitiveValue:forKey or get an infinite loop
[super insertObject:object atArrangedObjectIndexPath:indexPath];
【讨论】:
以上是关于观察 NSTreeController 绑定的核心数据实体以进行插入/删除的主要内容,如果未能解决你的问题,请参考以下文章
通过核心数据加载文件后,NSBrowser 不会从 NSTreeController 重新填充子项
NSTreeController 基于瞬态 isRoot 异常获取谓词
使用 NSTreeController 过滤 NSOutlineView 的子项
NSTreeController 显示重复实体的建议解决方案