Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cocoa 在非';t直接在根内_Cocoa_Swift_Nsoutlineview - Fatal编程技术网

Cocoa 在非';t直接在根内

Cocoa 在非';t直接在根内,cocoa,swift,nsoutlineview,Cocoa,Swift,Nsoutlineview,我有一个NSOutlineView,并在我的ViewController中实现了一个remove方法。 当我从根节点移除一个项目时,它的工作方式应该是这样的,但是当我从根节点中移除一个子节点时。应用程序崩溃,堆栈跟踪指向outlineView.RemoveItemSatiIndex 这是我的代码: if outlineView.selectedRow >= 0 && self.selectedItem != nil { if let item = s

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

这是我的代码:

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中使用它吗?我不这么认为。这只是我周一早上的想法,我想了解一下设计。非常感谢您的帮助。这是可行的,但我会在周末重新设计我的模型。