我正在NSOutlineView
中实现重命名/编辑功能。基本实现如下:
@objc func renameAction() {
let row = outlineView.clickedRow
let rowView = outlineView.view(
atColumn: 0,
row: row,
makeIfNecessary: false) as! NSTableCellView
rowView.textField!.isEditable = true
rowView.window?.makeFirstResponder(rowView.textField!)
}
mouseDown:
处理NSOutlineView
,以便NSTextField
点击正在编辑的行时退出编辑模式。
使用自定义委托的想法来自this question
override func mouseDown(with event: NSEvent) {
super.mouseDown(with: event)
let localLocation = self.convert(
event.locationInWindow,
from: nil)
let clickedRow = self.row(at: localLocation)
#if DEBUG
print(#file, #line, clickedRow)
#endif
if clickedRow != -1 {
self.extendedDelegate?.didClickRow(clickedRow)
}
}
在代表中:
func didClickRow(_ row: Int) {
//... get the textField
textField.isEditable = false
textField.resignFirstResponder()
textField.window?.makeFirstResponder(
textField.window?.contentView
)
}
奇怪的是我可以右键点击NSTableCellView
(包括图标和NSTextField
)以获取上下文菜单 左键单击任何行。左键单击后,我只能通过右键单击NSTableCellView
之外的任何位置(任何行,无论是否是单击的行),但是在行内({{1 }})。
在任何左键点击之前,右键点击NSTableCellView
会获得菜单:
在任何行上单击鼠标左键后,右键单击不会在所有NSTableCellView
上“开启”,但仍可在该行的空白区域内使用。
//点击NSTableCellView
后没有菜单。但是点击该行的空白区域时会出现菜单。
我发现,如果覆盖的NSTableCellView
已被注释掉(正如预期的那样),则没有问题。但是,这将通过单击当前行来结束编辑。