【发布时间】:2012-05-07 12:13:59
【问题描述】:
我正在尝试使用 NSTreeController 和绑定将基于视图的 NSOutlineView 连接到我的模型。
我的模型由一个主节点类(及其子类)组成。每个节点可以有 0 个或多个子节点。出于性能原因,我将孩子存储在一个 C 数组(节点对象)中。我定义了 NSTreeController 的 childrenKeyPath、countKeyPath 和 leafKeyPath 属性并在我的 Node 类中实现了它们:
- (NSArray *)childNodes {
return [NSArray arrayWithObjects:children_ count:childCount_];
}
- (BOOL)nodeIsLeaf {
return childCount_ < 1;
}
- (NSUInteger)childCount {
return childCount_;
}
当我添加一个新孩子时,我在将其插入 C 数组后调用 [self willChangeValueForKey:@"childNodes"] 和 [self didChangeValueForKey:@"childNodes"]。
我按照文档中的说明设置了绑定。 (我将 NSTreeController 的内容对象绑定到我的根节点。我将 NSOutlineView 的内容绑定到 NSTreeController 的排列对象。我还将 NSTextField 绑定到 NSTableViewCell 的 objectValue.name 属性)
初始配置(根对象及其子对象)在运行应用程序时加载良好。我还可以向根对象添加新的子对象。
但是,当我尝试将新的子节点添加到还没有子节点(没有显示三角形)的任何节点(除了根)时,NSOutlineView 不会更新(仍然没有三角形)。新节点正确插入模型并发送 will/didChangeValue 消息,但 NSTreeController 不会费心检查新的 children 数组。在这种情况下,记录上面的 3 个 keyPath 函数不会打印任何内容。
如果我关闭父节点并再次展开它,那么节点会重新加载,显示三角形,我可以展开节点以查看我刚刚添加的新节点。为什么 NSTreeController 不检查更改,即使我在更改子数组时发送了 KVO 消息?
【问题讨论】:
-
据我所知,这是基于视图的 NSOutlineView 中的一个错误。位于该位置的 NSTableRowView 缺少它需要的按钮子视图。当您将父级折叠并重新展开到有问题的行时,大纲视图会重新创建行视图并正确添加缺少的按钮。需要一种解决方法,以编程方式强制大纲视图重新创建该行视图,而无需进行任何其他视觉更改。
标签: objective-c xcode cocoa binding nsoutlineview