Swift-从NSViewController捕获keydown

我想在我的小应用程序中捕获关键事件。


我做了什么:


class ViewController : NSViewController {

...

  override func keyDown(theEvent: NSEvent) {

        if theEvent.keyCode == 124 {

            println("abc")

        } else {

            println("abcd")

        }

    }


    override var acceptsFirstResponder: Bool {

        return true

    }


    override func becomeFirstResponder() -> Bool {

        return true

    }


    override func resignFirstResponder() -> Bool {

        return true

    }


...

}

怎么了:


按下键时,会播放Funk声音效果。


我看过很多帖子在谈论如何,这是一个代表了属于NSView和NSViewController不具有访问权限。但是keydown函数override自动完成的类类型使NSViewController我相信这是错误的。


繁星coding
浏览 774回答 3
3回答

月关宝盒

迅捷4刚刚找到了针对同一问题的解决方案Swift4。其背后的思想是:如果按下的键是由自定义逻辑处理的,则处理程序应返回nil,否则返回(未处理的)事件...class MyViewController: NSViewController {   override func viewDidLoad() {      super.viewDidLoad()      // ...      NSEvent.addLocalMonitorForEvents(matching: .keyDown) {         if self.myKeyDown(with: $0) {            return nil         } else {            return $0         }      }   }   func myKeyDown(with event: NSEvent) -> Bool {      // handle keyDown only if current window has focus, i.e. is keyWindow      guard let locWindow = self.view.window,         NSApplication.shared.keyWindow === locWindow else { return false }      switch Int( event.keyCode) {      case kVK_Escape:         // do what you want to do at "Escape"         return true      default:          return false      }   }}我们在这里:按下键时没有发出Purr / Funk声音...[更新]添加了对keyWindow的检查。没有这个,即使另一个视图/窗口包含第一个响应者,也会触发keyDown()。

holdtom

我正在尝试为swift 3找到答案,这对我有用:迅捷3import Cocoa// We subclass an NSViewclass MainView: NSView {    // Allow view to receive keypress (remove the purr sound)    override var acceptsFirstResponder : Bool {        return true    }    // Override the NSView keydown func to read keycode of pressed key    override func keyDown(with theEvent: NSEvent) {        Swift.print(theEvent.keyCode)    }
打开App,查看更多内容
随时随地看视频慕课网APP