0

から継承したカスタム セルの作成に成功しました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
    }
}
4

0 に答える 0