我正在尝试以编程方式获取正在编辑的单元格的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上发生更改之前检测到更改。
答案 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
}