在 Swift 中检测按键事件
Posted
技术标签:
【中文标题】在 Swift 中检测按键事件【英文标题】:Detecting key press event in Swift 【发布时间】:2015-01-26 21:19:53 【问题描述】:我正在尝试寻找一种方法来检测是否在 Swift 上按下了一个键(在键盘上)。任何想法和建议将不胜感激。
【问题讨论】:
你自己尝试了什么? 这不是重复的。 Swift 问题的 Objective-C 答案不是重复的。 您想在什么情况下检测按键?在窗户上?输入? 嗨,Bjorn,就在窗口中。我想添加一个 if 语句,例如“如果按下了键 'A',则执行某些操作”等。 好的,对于其他感兴趣的人,我在下面的窗口中给出了如何执行此操作的确切示例。 【参考方案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")
【讨论】:
以上是关于在 Swift 中检测按键事件的主要内容,如果未能解决你的问题,请参考以下文章