使用NSTreeController,在更改模型数组时是否必须手动重新加载NSOutlineView?

Dru*_*erB 8 cocoa binding objective-c nsoutlineview nstreecontroller

我有一个类似树的模型,我希望使用NSTreeController在NSOutlineView中显示.

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

如果我将对象插入到扩展的对象组中,它的工作原理如下:

插入节点

新节点显示

但是如果我尝试将第一个对象添加到节点中,之前没有子节点,则没有任何反应.显示三角形没有出现,所以我无法扩展它以查看新节点.

插入新的孩子

在此输入图像描述

如果我将鼠标悬停在具有新对象的节点上,它将被展开,我可以添加第二个没有问题的子节点.但三角形仍然是隐形的:

在此输入图像描述

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

在此输入图像描述

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

更新:

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

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

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

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

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

- (BOOL)nodeIsLeaf {
    return [children count] < 1;
}
Run Code Online (Sandbox Code Playgroud)

我知道这(特别是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"];
}
Run Code Online (Sandbox Code Playgroud)

Ken*_*ses 2

您必须确保模型的所有更新都以符合键值观察的方式执行。

Cocoa 绑定编程主题:Cocoa 绑定故障排除