在 Swift 中检测按键事件

Detecting key press event in Swift

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

您必须重写 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")
}

由于您更新了问题并且想知道如何为 window 执行此操作,这里有一个答案。 Subclass NSWindow 并使用这个 subclass 代替。

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

import Cocoa

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

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

为了将事件从 this window class 传送到我的应用程序,我向 window 添加了一个函数,该函数接受一个回调函数,然后将其存储在数组中的回调函数。我可以通过 AppDelegate 访问这个 window,它可以获得对当前主 window 的弱引用。然后在上面的函数中,我遍历所有回调并使用 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 方法添加到我的应用委托 class。此方法 returns 将 NSWindow 转换为 KeyCaptureWindow。可能有更好的方法来完成这一切,但这对我有用。另一种可能的方法是使用急救人员和 NSView,但这不是我一直在做的。