在Swift中检测按键事件

and*_*ase 11 macos swift

我正试图找到一种方法来检测Swift上是否按下了某个键(在键盘上).任何想法和建议将不胜感激.

Bjo*_*orn 13

既然你更新了你的问题并想知道如何为一个窗口做这个,这里是一个答案.子类NSWindow并使用此子类代替.

您的自定义类应如下所示:

import Cocoa

class EditorWindow: NSWindow {
    override func keyDown(event: NSEvent) {
        super.keyDown(event)
        Swift.print("Caught a key down: \(event.keyCode)!")
    }
}
Run Code Online (Sandbox Code Playgroud)

如果您已在Interface Builder/XCode中创建窗口,请单击窗口对象并转到Attribute Inspector(+ + 3).属性检查器将位于右侧的边栏中.确保在Interface Builder中选择了您的窗口,在该区域的Attribute Inspector顶部Custom Class将您的新类放入类输入中.

属性选择器

为了将事件从这个窗口类传递到我的应用程序,我向窗口添加了一个函数,该函数接受一个回调函数,然后我将其存储在一个回调函数数组中.我可以通过AppDelegate访问这个窗口,它可以获得对当前主窗口的弱引用.然后在上面的函数中,我整体迭代回调,并以NSEvent作为参数调用它.我还首先检查是否通过modifierFlags事件的属性首先按下任何命令键,如选项键.最终看起来像这样:

import Cocoa

typealias Callback = (NSEvent) -> ()

class KeyCaptureWindow: NSWindow {

    var keyEventListeners = Array<Callback>()

    override func keyDown(event: NSEvent) {
        if event.modifierFlags.contains(NSEventModifierFlags.CommandKeyMask) {
            super.keyDown(event)
            return
        }
        for callback in keyEventListeners {
            callback(event)
        }
    }

    func addKeyEventCallback(callback: Callback) {
        keyEventListeners.append(callback)
    }


}
Run Code Online (Sandbox Code Playgroud)

然后在我的代码中的其他地方我有一条这样的行:

    let appDelegate = NSApplication.sharedApplication().delegate as! AppDelegate
    let mainWindow = appDelegate.getWindow()
    mainWindow.addKeyEventCallback(handleKeyEvent)
Run Code Online (Sandbox Code Playgroud)

我将getWindow方法添加到我的app委托类.此方法返回NSWindow强制转换为KeyCaptureWindow.可能有更好的方法来做这一切,但这对我有用.可能做到这一点的另一种方法是使用第一响应者NSView,但这不是我一直在做的.

  • Swift的最新版本已修改了该功能。现在是keyDown(事件:NSEvent)。感谢您的回答,非常有用! (2认同)

Chr*_*örz 5

你必须覆盖keyDown-method.

var direction:String = ""

override func keyDown(theEvent: NSEvent!) // A key is pressed
{
    if theEvent.keyCode == 123
    {
        direction = "left" //get the pressed key
    }
    else if theEvent.keyCode == 124
    {
        direction = "right" //get the pressed key
    }
    println("Key with number: \(theEvent.keyCode) was pressed")
}
Run Code Online (Sandbox Code Playgroud)