NSOutlineView, как получить выделенную ячейку - PullRequest
0 голосов
/ 28 апреля 2018

Я хочу получить выбранную ячейку из элемента управления NSOutlineView. Я нашел решение здесь: Как я могу получить выбранную ячейку из 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 голосов
/ 29 апреля 2018

Я сам решил эту проблему. Следующий код показывает, как получить выбранную ячейку:

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...