我已经成功创建了一个继承自NSTextFieldCell
. 自定义单元格需要返回一个自定义对象,而不是 textview 字符串。对于上下文,我正在尝试模拟系统偏好设置/键盘中的快捷方式网格。
到目前为止,我已经在 keyDown 上创建了自定义对象,但不确定如何返回它以在表中使用。
我将在哪里/如何设置我的对象以便可以从 tableView 中读取它?
private final class ShortcutTextFieldCellTextView: NSTextView, NSTextViewDelegate {
override func keyDown(with event: NSEvent) {
var globalKeybind: GlobalKeybindPreferences?
let textView = window?.firstResponder as? NSTextView
if let characters = event.charactersIgnoringModifiers {
let globalKeybind = GlobalKeybindPreferences.init(
function: event.modifierFlags.contains(.function),
control: event.modifierFlags.contains(.control),
command: event.modifierFlags.contains(.command),
shift: event.modifierFlags.contains(.shift),
option: event.modifierFlags.contains(.option),
capsLock: event.modifierFlags.contains(.capsLock),
carbonFlags: 0,
characters: characters,
keyCode: UInt32(event.keyCode)
)
textView?.string = globalKeybind.description
return
}
super.keyDown(with: event)
}
override func insertNewline(_ sender: Any?) {
window?.makeFirstResponder(nextResponder)
}
var originalText: String?
override func cancelOperation(_ sender: Any?) {
if let o = originalText {
self.string = o
}
window?.makeFirstResponder(nextResponder)
}
override func viewDidMoveToSuperview() {
if superview != nil {
originalText = textContainer?.textView?.string
}
}
}
final class ShortcutTextFieldCell: NSTextFieldCell {
private lazy var stfctv: ShortcutTextFieldCellTextView = {
return ShortcutTextFieldCellTextView()
}()
override func fieldEditor(for controlView: NSView) -> NSTextView? {
return stfctv
}
}
这是我想使用单元格中的自定义对象的地方。
func tableView(_ tableView: NSTableView, setObjectValue object: Any?, for tableColumn: NSTableColumn?, row: Int) {
if tableColumn == tableView.tableColumns[0] {
self.shortcuts[row].entityId = object as! String
}
if tableColumn == tableView.tableColumns[1] {
// This is where I need to use my object
self.shortcuts[row].shortcut = object as! GlobalKeybindPreferences
}
}