gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 03:33:49 24 4
gpt4 key购买 nike

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

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

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

Inserting node

New node showing

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

Inserting new child

enter image description here

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

enter image description here

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

enter image description here

这就是为什么我想知道是否必须手动重新加载 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)不是很优化,但我目前只是在试验,因为在最终版本中我的 child 将存储在 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"];
}

最佳答案

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

Cocoa Bindings Programming Topics: Troubleshooting Cocoa Bindings

关于objective-c - 使用 NSTreeController,我是否必须在更改模型数组时手动重新加载 NSOutlineView?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10525712/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com