在 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
,但这不是我一直在做的。
我正在尝试找到一种方法来检测是否在 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
,但这不是我一直在做的。