NSOutlineView没有更新

时间:2012-05-07 12:14:00

标签: objective-c xcode cocoa binding nsoutlineview

我正在尝试使用NSTreeController和绑定将基于视图的NSOutlineView连接到我的模型。

我的模型由一个主Node类(及其子类)组成。每个节点可以有0个或更多子节点。出于性能原因,我将子节点存储在C数组(Node对象)中。我定义了NSTreeController的childrenKeyPathcountKeyPathleafKeyPath属性,并在我的Node类中实现了它们:

- (NSArray *)childNodes {
return [NSArray arrayWithObjects:children_ count:childCount_];
}

- (BOOL)nodeIsLeaf {
    return childCount_ < 1;
}

- (NSUInteger)childCount {
    return childCount_;
}

当我添加一个新孩子时,我会在将[self willChangeValueForKey:@"childNodes"]插入C阵列之后调用[self didChangeValueForKey:@"childNodes"]

我按照文档中的描述设置了绑定。 (我将NSTreeController的Content Object绑定到我的根节点。我将NSOutlineView的内容绑定到NSTreeController的arrangeObjects。我还将NSTextField绑定到NSTableViewCell的objectValue.name属性)

在运行应用程序时,初始配置(根对象及其子项)已正确加载。我还可以将新子项添加到根对象。

但是当我尝试将新子节点添加到任何没有子节点的节点(根之外)(没有公开三角形)时,NSOutlineView不会更新(仍然没有三角形)。正确地将新节点插入到模型中并发送will / didChangeValue消息,但NSTreeController不会检查新的children数组。在这种情况下,记录上面的3个keyPath函数不会打印任何内容。

如果我关闭父节点并再次展开它,则会重新加载节点,显示显示三角形,我可以展开节点以查看刚刚添加的新节点。为什么NSTreeController不检查更改,即使我在更改子数组时发送了KVO消息?

1 个答案:

答案 0 :(得分:1)

好的,这样做:

/* item is the item which has just had new children added */
[_outlineView reloadItem:[_outlineView parentForItem:item] reloadChildren:YES];

它可能效率低下,甚至可能在Mountain Lion中修复,但这对我有用。您可以将所需的时间限制为当项目从0开始时 - >&gt; 1个孩子(反之亦然?)。