NSTableView在单元格版本开始时检测所选单元格的NSTableColumn

时间:2015-10-26 20:03:36

标签: swift macos cocoa nstableview nsarraycontroller

我正在尝试以编程方式获取正在编辑的单元格的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]

}

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

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

1 个答案:

答案 0 :(得分:1)

这个问题是1岁,但我今天得到了相同的问题并修复了它。人们在这里给了我很多帮助,所以如果有人找到这个话,我会自己做出贡献 这是解决方案:

1 /将NSTextFieldDelegate添加到ViewController:

class ViewController: NSViewController, NSTableViewDelegate, NSTableViewDataSource, NSTextFieldDelegate {

2 /当用户想要编辑单元格时,他首先要选择该行。所以我们将通过这个委托函数检测到它:

    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
}