首页 > 解决方案 > 为继承的 NSTextFieldCell 设置自定义 objectValue

问题描述

我已经成功创建了一个继承自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
    }
}

标签: swiftnstextfieldcell

解决方案


推荐阅读