在整个 window 中识别关键事件

recognizing key event in entire window

我正在开发一个音译应用程序,它从 NSTextView 获取一些文本并将其音译并放入另一个 NSTextView, 我想要做的是,当用户在输入单词并按下 space 时输入句子时,我希望 space 键触发一个动作,我指定将句子分成一个数组个人的话。 为了做到这一点,我尝试覆盖 viewController class:

中的 keyDown 函数
override func keyDown(theEvent: NSEvent) {
    if (theEvent.keyCode == 49){
        print("pressed space")
    }
}

不起作用,当我子 class NSTextView class 并覆盖其中的 keyDown 函数但我的 textView 停止输入文本时它起作用。 如何为有效的 space 键设置按键事件?通过按 space?

将句子分成单词数组的任何其他建议

谢谢

第 1 步是将您的视图控制器设置为 NSTextField 的委托。如果你使用 nibs 或 storyboard,它将看起来像这样:

基本上是按住 ctrl 拖动来查看控制器并设置委托。

然后您可以对视图控制器中更改的文本做出反应:

import Cocoa

class ViewController: NSViewController {


override func controlTextDidChange(obj: NSNotification) {

    guard let textField = obj.object as? NSTextField else { return }

    if textField.stringValue.characters.last == " " {
        print(textField.stringValue.componentsSeparatedByString(" "))
    }

}
}

它将打印出由 space:

分隔的单词数组

["a", ""]

["a", "boy", ""]

["a", "boy", "came", ""]

["a", "boy", "came", "to", ""]

["a", "boy", "came", "to", "school", ""]

您可能需要从数组中删除最后一项:

     override func controlTextDidChange(obj: NSNotification) {

    guard let textField = obj.object as? NSTextField else { return }

    if textField.stringValue.characters.last == " " {
        print(textField.stringValue.componentsSeparatedByString(" ").filter { [=11=] != "" })
    }

}

NSTextView 的逻辑是相似的。按住 Ctrl 从文本视图拖动以将视图控制器设置为委托:

然后使用下面的代码:

  func textDidChange(obj: NSNotification) {

    guard let textView = obj.object as? NSTextView else { return }
    guard let stringValue = textView.textContainer?.textView?.string else { return }

    if stringValue.characters.last == " " {
        print(stringValue.componentsSeparatedByString(" ").filter { [=12=] != "" })
    }

}

它将正常工作: