gpt4 book ai didi

cocoa - 从 NSOutlineView 中删除项目在不直接在根内的子元素上失败

转载 作者:搜寻专家 更新时间:2023-11-01 05:41:48 28 4
gpt4 key购买 nike

我有一个 NSOutlineView 并在我的 ViewController 中实现了一个 remove 方法。当我从根节点中删除一个项目时,它会像它应该的那样工作,但是当我从根节点中删除一个子节点时。应用程序崩溃,堆栈跟踪指向 outlineView.removeItemsAtIndexes

这是我的代码:

if outlineView.selectedRow >= 0 && self.selectedItem != nil {
if let item = self.selectedItem {

if let parentNode = dataRoot.getParentOf(item) {
println("REMOVE FROM \(parentNode.keyname)")

outlineView.removeItemsAtIndexes(NSIndexSet(index: outlineView.selectedRow - 1), inParent: parentNode, withAnimation: NSTableViewAnimationOptions.SlideUp)

}
dataRoot.remove(item)
self.outlineView.reloadData()
}
}

我打印 REMOVE FROM 以确保 getParentOf 函数正常工作。确实如此。

- root
- sub-1
- sub-2
- sub-sub1-1

删除 sub-1 可以,删除 sub-sub-1 失败。

为什么如果 parentNode 是 dataRoot 我可以删除一个项目,但如果它是 dataNode 中的子节点则不能?

错误是:

NSOutlineView error removing child indexes <NSIndexSet: 0x600000227120>[number of indexes: 1 (in 1 ranges), indexes: (9)] in parent 0x6000000af720 (which has 4 children).

感谢您的帮助。附言

* 更新 *

好的,Index 位于 inParent 内部,而不是整个大纲中!但是如何从 selectedRow 中获取呢?

最佳答案

您的数据源应该能够在其父级中找到项目的索引。毕竟,它首先通过索引提供了父项的子项 (outlineView(_:child:ofItem:))。

但是,如果您要告诉大纲 View 重新加载其数据,那么使用 removeItemsAtIndexes(_:inParent:withAnimation:) 就没有意义了。该方法的要点是让大纲 View 了解模型更改,而无需重新加载整个大纲。

关于cocoa - 从 NSOutlineView 中删除项目在不直接在根内的子元素上失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28789454/

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