在 NSOutlineView 选择上获取 NSTreeController 数据
Getting NSTreeController Data on NSOutlineView selection
我构建了一个 NSOutlineView
,它从 NSTreeController
获取动态更新的数据,并且一切正常。我似乎无法做的是根据 NSOutlineView 中的用户 selection 从那里向后工作。
var deviceStore = [TreeNode]()
是我的实时更新的后备数据存储,它是 Device
个对象的数组,可能(也可能不)包含 Service
个对象的数组作为子对象。
一切正常。但是当我在大纲视图中 select 一行时,我需要按照我的方式 返回 到 deviceStore 中的原始对象——或者,至少,获取显示来自 OutlineView 的数据,以便我可以遍历 deviceStore 以 找到 原始项目。
我得到的是 func outlineViewSelectionDidChange(_ notification: Notification) {}
,它在创建 selection 时被调用,我可以从中通过 treeController.selectedNodes
提取 NSTreeController TreeNode,但是从那里,我在杂草丛中。 selectedNodes 是 selected 节点的完整数组,因此如果它是子(叶)节点,则它包括其父节点及其所有兄弟节点。
然后给出 Table 显示如下:
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]。
如果我可以从 selected 行检索服务 ID 列中的值,我可以简单地遍历 deviceStore 树来找到它。
我确定有一种简单、优雅、简单的方法可以做到这一点,但我还没有找到,但是作为 NSTreeController
s 和 NSOutlineView
s 的新手,我迷路了.
您可以尝试像这样直接访问关联对象:
let selectedService = treeController.selectedObjects.first as? Service
文档 are here.
还要确保您的 NSTreeController
已正确配置为使用您的 class' 对象:
或者(如果您想直接使用您的数据源)您可能想要 get the index path 在 NSTreeController
:
中选择的对象
var selectionIndexPath: IndexPath? { get }
我从未真正返回到基于用户在 TreeView 中单击位置的 TreeController backing-store 数据。不过,我 是 能够做的是向后处理数据。
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
...
}
然后我可以 'walk' deviceStrore
数组,直到我在其中找到 devName
和 devID
,并相应地处理它。
可能不是最优雅的解决方案,但至少它最终起作用了。
我将以下内容与核心数据一起使用,
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
}
我构建了一个 NSOutlineView
,它从 NSTreeController
获取动态更新的数据,并且一切正常。我似乎无法做的是根据 NSOutlineView 中的用户 selection 从那里向后工作。
var deviceStore = [TreeNode]()
是我的实时更新的后备数据存储,它是 Device
个对象的数组,可能(也可能不)包含 Service
个对象的数组作为子对象。
一切正常。但是当我在大纲视图中 select 一行时,我需要按照我的方式 返回 到 deviceStore 中的原始对象——或者,至少,获取显示来自 OutlineView 的数据,以便我可以遍历 deviceStore 以 找到 原始项目。
我得到的是 func outlineViewSelectionDidChange(_ notification: Notification) {}
,它在创建 selection 时被调用,我可以从中通过 treeController.selectedNodes
提取 NSTreeController TreeNode,但是从那里,我在杂草丛中。 selectedNodes 是 selected 节点的完整数组,因此如果它是子(叶)节点,则它包括其父节点及其所有兄弟节点。
然后给出 Table 显示如下:
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]。
如果我可以从 selected 行检索服务 ID 列中的值,我可以简单地遍历 deviceStore 树来找到它。
我确定有一种简单、优雅、简单的方法可以做到这一点,但我还没有找到,但是作为 NSTreeController
s 和 NSOutlineView
s 的新手,我迷路了.
您可以尝试像这样直接访问关联对象:
let selectedService = treeController.selectedObjects.first as? Service
文档 are here.
还要确保您的 NSTreeController
已正确配置为使用您的 class' 对象:
或者(如果您想直接使用您的数据源)您可能想要 get the index path 在 NSTreeController
:
var selectionIndexPath: IndexPath? { get }
我从未真正返回到基于用户在 TreeView 中单击位置的 TreeController backing-store 数据。不过,我 是 能够做的是向后处理数据。
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
...
}
然后我可以 'walk' deviceStrore
数组,直到我在其中找到 devName
和 devID
,并相应地处理它。
可能不是最优雅的解决方案,但至少它最终起作用了。
我将以下内容与核心数据一起使用,
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
}