我正试图找到一种方法来检测Swift上是否按下了某个键(在键盘上)。任何想法和建议将不胜感激。
答案 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顶部将您的新类放入类输入中。
为了将事件从这个窗口类传递到我的应用程序,我向窗口添加一个函数,该函数接受一个回调函数,然后我将其存储在一个回调函数数组中。我可以通过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")
}