NSOutlineView,如何获取所选单元格

时间:2018-04-28 08:08:02

标签: swift macos cocoa

我想从NSOutlineView控件中获取所选单元格。我在这里找到了一个解决方案:How can I get the selected cell from a NSOutlineView?。它说

  

使用委托。 willDisplayCell:在单元格更改其选择状态时调用。

然而,当我测试它时,我发现我的willDisplayCell:没有被调用。

这是我的代码,它可以正常运行,但willDisplayCell:方法从未被调用过。我在哪里弄错了?感谢。

class TreeNode: NSObject{
    var name: String = ""
    private(set) var isLeaf: Bool = false
    var children: [TreeNode]?

    init(name: String, isLeaf: Bool){
        self.name = name
        self.isLeaf = isLeaf
        if !isLeaf{
            children = [TreeNode]()
        }
    }
}

class ViewController: NSViewController {

    @IBOutlet weak var sourceList: NSOutlineView!

    private var data = TreeNode(name: "Root", isLeaf: false)

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.

        for i in 0..<10{
            let node = TreeNode(name: "name \(i)", isLeaf: i % 2 == 0)
            data.children?.append(node)
        }
    }
}

extension ViewController: NSOutlineViewDataSource {
    func outlineView(_ outlineView: NSOutlineView, numberOfChildrenOfItem item: Any?) -> Int {
        if let item = item as? TreeNode, !item.isLeaf {
            return item.children!.count
        }
        return 1
    }
    func outlineView(_ outlineView: NSOutlineView, isItemExpandable item: Any) -> Bool {
        return !((item as? TreeNode)?.isLeaf ?? false)
    }
    func outlineView(_ outlineView: NSOutlineView, child index: Int, ofItem item: Any?) -> Any {
        if let item = item as? TreeNode {
            if item.isLeaf{
                return item
            }else{
                return item.children![index]
            }
        }
        return data
    }
}
extension ViewController: NSOutlineViewDelegate {

    func outlineView(_ outlineView: NSOutlineView, willDisplayCell cell: Any, for tableColumn: NSTableColumn?, item: Any) {
        print("called")
    }

    func outlineView(_ outlineView: NSOutlineView, viewFor tableColumn: NSTableColumn?, item: Any) -> NSView? {
        let cell: NSTableCellView?
        if let item = item as? TreeNode{
            cell = outlineView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(rawValue:  "DataCell"), owner: self) as? NSTableCellView
            cell?.textField?.stringValue = item.name
        }else{
            cell = nil
        }
        return cell
    }
}

enter image description here

1 个答案:

答案 0 :(得分:0)

我自己解决了这个问题。以下代码是如何获取所选单元格:

func getSelectedCell() -> NSTableCellView? {
    if let view = self.sourceList.rowView(atRow: self.sourceList.selectedRow, makeIfNecessary: false) {
        return view.view(atColumn: self.sourceList.selectedColumn) as? NSTableCellView
    }
    return nil
}

现在,我可以通过代码NSTextField访问getSelectedCell()?.textField控件。