【问题标题】:Detecting key press event in Swift在 Swift 中检测按键事件
【发布时间】:2015-01-26 21:19:53
【问题描述】:

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

【问题讨论】:

  • 你自己尝试了什么?
  • 这不是重复的。 Swift 问题的 Objective-C 答案不是重复的。
  • 您想在什么情况下检测按键?在窗户上?输入?
  • 嗨,Bjorn,就在窗口中。我想添加一个 if 语句,例如“如果按下了键 'A',则执行某些操作”等。
  • 好的,对于其他感兴趣的人,我在下面的窗口中给出了如何执行此操作的确切示例。

标签: macos swift


【解决方案1】:

由于您更新了问题并且想知道如何为窗​​口执行此操作,因此这里有一个答案。子类 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 区域中的属性检查器顶部将您的新类放入类输入中。

为了将来自此窗口类的事件传递给我的应用程序,我向窗口添加了一个函数,该函数接受一个回调函数,然后将其存储在一个回调函数数组中。我可以通过 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 方法添加到我的应用委托类中。此方法将NSWindow 转换为KeyCaptureWindow。可能有更好的方法来做这一切,但这对我有用。另一种可能做到这一点的方法是使用第一响应者和NSView,但这不是我一直这样做的方式。

【讨论】:

  • 如果有多个键盘连接到计算机,是否可以识别偶数来自哪个键盘?
  • 最近的 Swift 版本已经修改了这个函数。现在是 keyDown(带有事件:NSEvent)。感谢您的回答,非常有用!
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-30
    • 1970-01-01
    相关资源
    最近更新 更多