NSTableView 在单元格编辑开始时检测所选单元格的 NSTableColumn

NSTableView detect NSTableColumn for selected cell at start of cell edition

我正在尝试以编程方式为正在编辑的单元格获取 column.identifier。我试图通过为 NSControlTextDidBeginEditingNotification 注册我的 NSViewController 来获得,当我收到通知时,我通过鼠标位置跟踪数据:

var selectedRow = -1
var selectedColumn: NSTableColumn?

func editingStarted(notification: NSNotification) {
    selectedRow = participantTable.rowAtPoint(participantTable.convertPoint(NSEvent.mouseLocation(), fromView: nil))

    let columnIndex = participantTable.columnAtPoint(participantTable.convertPoint(NSEvent.mouseLocation(), fromView: nil))
   selectedColumn = participantTable.tableColumns[columnIndex]

}

我遇到的问题是鼠标位置给我错误的数据,有没有办法根据 table 的位置获取鼠标位置,或者有更好的方法来得到这个信息?

PS。我的 NSViewController 是 NSTableViewDelegate 和 NSTableViewDataSource,我的 NSTableView 是 View Based 并连接到正确更新的 ArrayController,我可以转到我的模型对象并检测 willSet 或 didSet 属性的变化,但是我需要检测用户何时进行更改,这就是为什么我需要在 NSTableView 上发生更改之前检测到更改。

这个问题已有 1 年历史,但我今天遇到了同样的问题并已解决。人们在这里帮了我很多,所以如果有人找到这个帖子,我会贡献自己的力量。
这是解决方案:

1/ 将 NSTextFieldDelegate 添加到您的 ViewController :

class ViewController: NSViewController, NSTableViewDelegate, NSTableViewDataSource, NSTextFieldDelegate {

2/ 当用户想要编辑一个单元格时,他必须先select该行。所以我们将用这个委托函数检测到:

    func tableViewSelectionDidChange(_ notification: Notification) {
        let selectedRow = self.tableView.selectedRow

        // If the user selected a row. (When no row is selected, the index is -1)
        if (selectedRow > -1) {
        let myCell = self.tableView.view(atColumn: self.tableView.column(withIdentifier: "myColumnIdentifier"), row: selectedRow, makeIfNecessary: true) as! NSTableCellView

        // Get the textField to detect and add it the delegate
        let textField = myCell.textField
        textField?.delegate = self
    }
}

3/ 当用户编辑单元格时,我们可以使用 3 个不同的函数获取事件(和数据)。选择您需要的:

override func controlTextDidBeginEditing(_ obj: Notification) {
    // Get the data when the user begin to write
}

override func controlTextDidEndEditing(_ obj: Notification) {
    // Get the data when the user stopped to write
}

override func controlTextDidChange(_ obj: Notification) {
    // Get the data every time the user writes a character
}