从 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:)
就没有意义了。该方法的要点是让大纲视图知道模型更改,而无需重新加载整个大纲。
我有一个 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:)
就没有意义了。该方法的要点是让大纲视图知道模型更改,而无需重新加载整个大纲。