gpt4 book ai didi

objective-c - NSOutlineView 不更新

转载 作者:搜寻专家 更新时间:2023-10-30 19:48:12 25 4
gpt4 key购买 nike

我正在尝试使用 NSTreeController 和绑定(bind)将基于 View 的 NSOutlineView 连接到我的模型。

我的模型由一个主 Node 类(及其子类)组成。每个节点可以有 0 个或多个子节点。出于性能原因,我将子项存储在 C 数组(节点对象)中。我定义了我的 NSTreeController 的 childrenKeyPathcountKeyPathleafKeyPath 属性,并在我的 Node 类中实现了它们:

- (NSArray *)childNodes {
return [NSArray arrayWithObjects:children_ count:childCount_];
}

- (BOOL)nodeIsLeaf {
return childCount_ < 1;
}

- (NSUInteger)childCount {
return childCount_;
}

当我添加一个新的 child 时,我在插入之前调用[self willChangeValueForKey:@"childNodes"],在插入之后调用[self didChangeValueForKey:@"childNodes"] C 数组。

我按照文档中的描述设置了绑定(bind)。(我将 NSTreeController 的内容对象绑定(bind)到我的根节点。我将 NSOutlineView 的内容绑定(bind)到 NSTreeController 的 arrangedObjects。我还将 NSTextField 绑定(bind)到 NSTableViewCell 的 objectValue.name 属性)

初始配置(根对象及其子对象)在运行应用程序时加载良好。我还可以向根对象添加新的子对象。

但是,当我尝试向任何还没有子节点( 根除外)添加新子节点(没有显示三角形)时,NSOutlineView 不会更新(仍然没有三角形)。新节点被正确插入到模型中并发送了 will/didChangeValue 消息,但 NSTreeController 不会费心检查新的子数组。在这种情况下,记录上面的 3 个 keyPath 函数不会打印任何内容。

如果我关闭父节点并再次展开它,则会重新加载节点,显示三角形,我可以展开节点以查看我刚刚添加的新节点。为什么 NSTreeController 不检查更改,即使我在更改子数组时发送了 KVO 消息?

最佳答案

好的,这样就可以了:

/* item is the item which has just had new children added */
[_outlineView reloadItem:[_outlineView parentForItem:item] reloadChildren:YES];

它可能效率低下,甚至可能在 Mountain Lion 中修复,但这对我有用。您可以将需要执行此操作的次数限制为项目从 0 -> 1 个 child (反之亦然?)。

关于objective-c - NSOutlineView 不更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10481886/

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