NSTextView (macOS) 中的按键事件

Posted

技术标签:

【中文标题】NSTextView (macOS) 中的按键事件【英文标题】:Key pressed event in NSTextView (macOS) 【发布时间】:2016-08-31 14:46:30 【问题描述】:

我正在为 macOS 编写 Swift 代码(所以我使用的是 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
    

相关问题:How to capture user input in real time in NSTextField?

【问题讨论】:

【参考方案1】:

您可以覆盖 NSTextView 的 keyDown(with event: NSEvent) 进行一般按键操作。并检查event.charactersIgnoringModifiersevent.modifierFlags 以了解按下了哪个键。

【讨论】:

完美运行

以上是关于NSTextView (macOS) 中的按键事件的主要内容,如果未能解决你的问题,请参考以下文章

当新的 NSTextView 成为 FirstResponder (MacOS) 时如何移动光标?

macOS 按键事件慢速重复

NSTextView/NSTextfields 中的工具提示

如何以编程方式将文本作为NSTextView中的超链接? Swift 4,Xcode 9.4

具有多个控件的按键

swift—UITextField与 NSTextView 的键盘事