在NSOutlineView选择上获取NSTreeController数据

时间:2017-01-06 15:59:25

标签: swift macos nsoutlineview nstreecontroller

我已经构建了NSOutlineView,可以从NSTreeController获取动态更新的数据,并且一切正常。根据NSOutlineView中的用户选择,我无法做的就是从那里向后工作。

    var deviceStore = [TreeNode]()

是我的实时更新的后备数据存储区,它是Device个对象的数组,可能)或可能不包含Service个对象作为子节点。

这一切都有效。但是当我在Outline视图中选择一行时,我需要按照返回的方式工作到deviceStore中的原始对象 - 或者至少从OutlineView获取显示的数据,以便我可以将deviceStore转到查找原始项目。

我所得到的是func outlineViewSelectionDidChange(_ notification: Notification) {},在做出选择时会调用它,我可以从中通过treeController.selectedNodes提取NSTreeController TreeNode但是从那里,我在杂草。 selectedNodes是所选节点的完整数组,因此如果它是子(叶)节点,则它包括其父节点及其所有兄弟节点。

然后在此处显示表格: OutlineView

selectedNodes数组如下所示:

<NSTreeControllerTreeNode: 0x6080000c4590>, child nodes {
    0:<NSTreeControllerTreeNode: 0x6000000ca6b0>, child nodes {
        0:<NSTreeControllerTreeNode: 0x6000000caf70>, child nodes {}
        1:<NSTreeControllerTreeNode: 0x6000000cafe0>, child nodes {}
        2:<NSTreeControllerTreeNode: 0x6000000cb050>, child nodes {}
    }
    1:<NSTreeControllerTreeNode: 0x6080000d1790>, child nodes {
        0:<NSTreeControllerTreeNode: 0x6000000cce80>, child nodes {}
    }
}

selectedIndex为4.

我无法在这个信息中看到如何回到我的数据模型中的deviceStore [0] .serviceStore [2]。

如果我可以从所选行中检索服务ID列中的值,我可以简单地遍历deviceStore树来查找它。

我确信有一种简单,优雅,简单的方法可以做到这一点,我还没有找到,但对NSTreeControllerNSOutlineView不熟悉我输了。

3 个答案:

答案 0 :(得分:1)

您可以尝试直接访问相关联的对象:

let selectedService = treeController.selectedObjects.first as? Service

文档are here

还要确保您的NSTreeController已正确配置为使用您的班级对象:

enter image description here

或者(如果您想直接使用数据源),您可能需要NSTreeController中所选对象的get the index path

var selectionIndexPath: IndexPath? { get }

答案 1 :(得分:1)

我使用以下核心数据,

func outlineViewSelectionDidChange(_ notification: Notification) {
    let item = outlineView.item(atRow: outlineView.selectedRow) as! NSTreeNode
    let fileItem = item.representedObject as! FileItemMO

    // Do what you need to do with object fileItem

}

答案 2 :(得分:0)

我无法真正回到TreeController后备存储数据,该数据基于用户在TreeView中单击的位置。我 能够做的就是向后处理数据。

func outlineViewSelectionDidChange(_ notification: Notification) {
    let selectedIndex = (notification.object as AnyObject).selectedRow!
    let selCol1 = outlineView.view(atColumn: 0, row: selectedIndex, makeIfNecessary: false)?.subviews.last as! NSTextField
    let selCol2 = outlineView.view(atColumn: 1, row: selectedIndex, makeIfNecessary: false)?.subviews.last as! NSTextField

    let devName = selCol1.stringValue
    let devID = selCol2.stringValue
...
}

然后我可以“走”deviceStrore数组,直到我找到devNamedevID,然后相应地处理它。

可能不是最优雅的解决方案,但至少它终于有效了。