我有一个树状模型,我想使用 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"];
}