8

我有一个树状模型,我想使用 NSTreeController 在 NSOutlineView 中显示。

只要我使用 NSTreeController 的插入和删除函数来更改我的模型树,我就能够设置绑定并且一切正常。如果我尝试直接从模型树中插入或删除,在某些情况下 NSOutlineView 不会更新。

如果我将一个对象插入到扩展的对象组中,它会起作用:

插入节点

新节点显示

但是,如果我尝试将第一个对象添加到之前没有子节点的节点,则不会发生任何事情。显示三角形没有出现,所以我无法展开它来查看新节点。

插入新的孩子

在此处输入图像描述

如果我用一个新对象将鼠标悬停在那个节点上,它就会展开,我可以毫无问题地添加第二个孩子。但是三角形仍然是不可见的:

在此处输入图像描述

最后,如果我关闭所有这些节点的父节点并再次打开它们(触发重新加载),三角形会突然出现:

在此处输入图像描述

这就是为什么我想知道是否必须手动重新加载 NSOutlineView 的行以使三角形可见,或者我是否搞砸了什么?谢谢!!

更新:

在我的 Node 类中,我添加了一个像这样的新孩子:

- (void)addChild:(MyNode *)child {
    [self willChangeValueForKey:@"childNodes"];
    [children addObject:child];
    [self didChangeValueForKey:@"childNodes"];
}

我也实现了这些(我在 IB 中为我的 NSTreeController 设置):

- (NSArray *)childNodes {
    return [NSArray arrayWithArray:children];
}

- (NSInteger)countOfChildNodes {
    return [children count];
}

- (BOOL)nodeIsLeaf {
    return [children count] < 1;
}

我知道这(尤其是childNodes)不是很优化,但我目前只是在试验,因为在最终版本中,我的孩子将存储在 C 数组中。

更新 2:

我也尝试为其他 2 个属性发送 KVO 通知,但这也无济于事。

- (void)addChild:(MyNode *)child {
    NSLog(@"%@", NSStringFromSelector(_cmd));
    [self willChangeValueForKey:@"nodeIsLeaf"];
    [self willChangeValueForKey:@"countOfChildNodes"];
    [self willChangeValueForKey:@"childNodes"];
    [children addObject:child];
    [self didChangeValueForKey:@"childNodes"];
    [self didChangeValueForKey:@"countOfChildNodes"];
    [self didChangeValueForKey:@"nodeIsLeaf"];
}
4

1 回答 1

2

您必须确保对模型的所有更新都以符合 Key-Value Observing 的方式执行。

Cocoa Bindings 编程主题:Cocoa Bindings 疑难解答

于 2012-05-10T00:16:34.743 回答