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