から継承したカスタム セルの作成に成功しましたNSTextFieldCell
。カスタム セルは、テキストビュー文字列ではなく、カスタム オブジェクトを返す必要があります。コンテキストについては、システム環境設定/キーボード内のショートカット グリッドをエミュレートしようとしています。
これまでのところ、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
}
}