我想使用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"];
}
答案 0 :(得分:2)
您必须确保以符合键值观察的方式执行模型的所有更新。
Cocoa Bindings Programming Topics: Troubleshooting Cocoa Bindings