Cocoa 在非';t直接在根内
我有一个NSOutlineView,并在我的ViewController中实现了一个remove方法。 当我从根节点移除一个项目时,它的工作方式应该是这样的,但是当我从根节点中移除一个子节点时。应用程序崩溃,堆栈跟踪指向outlineView.RemoveItemSatiIndex 这是我的代码:Cocoa 在非';t直接在根内,cocoa,swift,nsoutlineview,Cocoa,Swift,Nsoutlineview,我有一个NSOutlineView,并在我的ViewController中实现了一个remove方法。 当我从根节点移除一个项目时,它的工作方式应该是这样的,但是当我从根节点中移除一个子节点时。应用程序崩溃,堆栈跟踪指向outlineView.RemoveItemSatiIndex 这是我的代码: if outlineView.selectedRow >= 0 && self.selectedItem != nil { if let item = s
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 func正常工作。是的
- root
- sub-1
- sub-2
- sub-sub1-1
拆卸sub-1正常,拆卸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).
NSOutlineView删除父级0x6000000af720(有4个子级)中的子索引[索引数:1(在1个范围内),索引:(9)]时出错。
谢谢你的帮助。
ps
*更新*
啊,好的,索引在项目内部,而不是在整个大纲中!但是如何从selectedRow获取此信息呢?您的数据源应该能够找到父项中某个项的索引。毕竟,它首先通过索引提供了父项的子项(
outlineView(\uu:child:ofItem:)
)
但是,如果要告诉outline视图重新加载其数据,那么使用
RemoveItemSatiIndex(\uu∶inParent:withAnimation:)
是没有意义的。该方法的要点是让outline视图知道模型更改,而不必重新加载整个outline。Hi ken。很多。我明白了,重新加载和删除是不明确的。我应该去实现一个dataRoot.getIndexOfItem(root:)方法?或者我应该在大纲视图中这样做?如果不知道您的数据源和模型是如何设计的,我很难确定。在我看来,查询parentNode
以获取其子节点的索引更合适。我给了我的模型两个函数:getRootOf(node:)和getIndexOf(node:,inParent:)。这个很好用。但我不相信这个架构。我的模型或多或少是一个树列表。模型具有子节点阵列,该阵列可以具有其他子节点,依此类推。这两个函数在模型中的实现,嗯。。。功能应该在我的数据结构之外。我可以肯定地将它们移动到一个helper类,但我无法真正从脑海中摆脱这应该是一个UI任务的想法。但我真的想在我的ViewController中使用它吗?我不这么认为。这只是我周一早上的想法,我想了解一下设计。非常感谢您的帮助。这是可行的,但我会在周末重新设计我的模型。