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

Removing a Item from a NSOutlineView fails on child elements that aren't directly inside the root

我有一个 NSOutlineView 并在我的 ViewController 中实现了一个删除方法。 当我从根节点中删除一个项目时,它会像它应该的那样工作,但是当我从根节点中删除一个子节点时。应用程序崩溃并显示指向 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失败。

为什么如果父节点是 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).

感谢您的帮助。 ps

* 更新 *

好的,Index 在 inParent 里面,而不是在整个大纲中!但是如何从 selectedRow 得到这个?

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

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