Событие нажатия клавиши в NSTextView (macOS)

Я пишу код на Swift для macOS (поэтому я использую AppKit, а не UIKit). У меня есть NSTextView, который нельзя редактировать. Я хочу эмулировать своего рода терминал. Код ниже понимает, когда пользователь нажимает RETURN, и печатает «>>\n». Я хотел бы иметь возможность получать уведомления, когда пользователь нажимает любую клавишу, чтобы написать соответствующую клавишу. Например, если пользователь нажмет BACKSPACE, я удалю один символ из NSTextView, если только «>>» не будет удален.

Это код. импорт какао

class ViewController: NSViewController {
    @IBOutlet var console: Console!

    override func viewDidLoad() {
        super.viewDidLoad()

        console.parent = self
        }

        func newLine() {
            let textStorage = console.textStorage
            if(textStorage != nil) {
                let myString = "\n>>"
                let myAttribute = [ NSForegroundColorAttributeName: NSColor.greenColor(), NSFontAttributeName: NSFont(name: "Menlo Regular", size: 13.0)! ]
                let myAttrString = NSAttributedString(string: myString, attributes: myAttribute)

                textStorage!.appendAttributedString(myAttrString)
                let length = console.string!.characters.count

                console.setSelectedRange(NSRange(location: length,length: 0))
                console.scrollRangeToVisible(NSRange(location: length,length: 0))
            }
        }

    override var representedObject: AnyObject? {
        didSet {
        // Update the view, if already loaded.
        }
    }
}

class Console : NSTextView {
    var parent: ViewController?
    override func insertNewline(sender: AnyObject?) {
        parent!.newLine()
    }

    override func controlTextDidBeginEditing(obj: NSNotification) {
        NSLog("wow") //unfortunately this method is never called, even setting the NSTextView as Editable
    }
}

Связанный с этим вопрос: Как записывать пользовательский ввод в режиме реального времени в NSTextField?


person Nisba    schedule 31.08.2016    source источник


Ответы (1)


Вы можете переопределить keyDown(with event: NSEvent) NSTextView для общего нажатия клавиши. И проверьте event.charactersIgnoringModifiers или event.modifierFlags, чтобы узнать, какая клавиша была нажата.

person 1024jp    schedule 15.09.2016
comment
Работает отлично - person Nisba; 09.12.2016