在Swift中检测按键事件

时间:2015-01-26 21:19:54

标签: macos swift

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

2 个答案:

答案 0 :(得分:13)

由于您更新了问题,并且您想知道如何为窗​​口执行此操作,这是一个答案。子类NSWindow并改为使用此子类。

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

import Cocoa

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

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

Attribute Selector

为了将事件从这个窗口类传递到我的应用程序,我向窗口添加一个函数,该函数接受一个回调函数,然后我将其存储在一个回调函数数组中。我可以通过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)
    }


}

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

    let appDelegate = NSApplication.sharedApplication().delegate as! AppDelegate
    let mainWindow = appDelegate.getWindow()
    mainWindow.addKeyEventCallback(handleKeyEvent)

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

答案 1 :(得分:5)

您必须覆盖keyDown - 方法。

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")
}