我需要按下箭头键,但 keyDown 不会调用 (Swift)
I need to get arrow key presses, but keyDown won't call (Swift)
我正在尝试构建一个 Mac 显示图像的应用程序,我想在按向右箭头键时转到下一张图像。我已经查看了 Whosebug 和互联网,但似乎无法理解。
我试过的...我试过使用keyDown(theEvent: NSEvent)
但是当我按下任何键时它没有调用。我相信这是因为它不在某种文本字段中,但不确定。
发生了什么... 当我测试程序时,我按下一个键(keyDown 功能准备好 println("Key Pressed")
)然后我得到 OS X 拒绝噪音并且没有 println 到控制台。
我听说有些人将 NSView 子类化以覆盖 acceptsFirstResponder
,但我是子类化的新手,所以如果您能指出我的方向,那就太好了。或者如果有办法做到这一点 w/o 将 NSView 子类化那就太好了!
提前致谢!对不起,菜鸟。
Subclass并不像看起来那么难。
简短教程:
一般假设: 键击将在 NSViewController subclass 的视图中接收并在视图控制器中处理 class
- 创建一个名为
MyView
的新 Cocoa Class 作为 NSView
的子class
将创建的class内容替换为
import Cocoa
let leftArrowKey = 123
let rightArrowKey = 124
protocol MyViewDelegate {
func didPressLeftArrowKey()
func didPressRightArrowKey()
}
class MyView: NSView {
var delegate : MyViewDelegate?
override func keyDown(event: NSEvent) {
let character = Int(event.keyCode)
switch character {
case leftArrowKey, rightArrowKey:
break
default:
super.keyDown(event)
}
}
override func keyUp(event: NSEvent) {
let character = Int(event.keyCode)
switch character {
case leftArrowKey:
delegate?.didPressLeftArrowKey()
case rightArrowKey:
delegate?.didPressRightArrowKey()
default:
super.keyUp(event)
}
}
override var acceptsFirstResponder : Bool {
return true
}
}
- 将 Interface Builder 中 ViewController 视图的 class 更改为
MyView
在ViewControllerclass中添加协议MyViewDelegate
——例如
class ViewController: NSViewController, MyViewDelegate {
在viewDidLoad()
中添加
let view = self.view as! MyView
view.delegate = self
self.nextResponder = view
实现以下委托方法并添加代码以切换图像
func didPressLeftArrowKey() {
println("didPressLeftArrowKey")
// process keystroke left arrow
}
func didPressRightArrowKey() {
println("didPressRightArrowKey")
// process keystroke right arrow
}
释放适当的箭头键时调用委托方法
我正在尝试构建一个 Mac 显示图像的应用程序,我想在按向右箭头键时转到下一张图像。我已经查看了 Whosebug 和互联网,但似乎无法理解。
我试过的...我试过使用keyDown(theEvent: NSEvent)
但是当我按下任何键时它没有调用。我相信这是因为它不在某种文本字段中,但不确定。
发生了什么... 当我测试程序时,我按下一个键(keyDown 功能准备好 println("Key Pressed")
)然后我得到 OS X 拒绝噪音并且没有 println 到控制台。
我听说有些人将 NSView 子类化以覆盖 acceptsFirstResponder
,但我是子类化的新手,所以如果您能指出我的方向,那就太好了。或者如果有办法做到这一点 w/o 将 NSView 子类化那就太好了!
提前致谢!对不起,菜鸟。
Subclass并不像看起来那么难。
简短教程:
一般假设: 键击将在 NSViewController subclass 的视图中接收并在视图控制器中处理 class
- 创建一个名为
MyView
的新 Cocoa Class 作为NSView
的子class
将创建的class内容替换为
import Cocoa let leftArrowKey = 123 let rightArrowKey = 124 protocol MyViewDelegate { func didPressLeftArrowKey() func didPressRightArrowKey() } class MyView: NSView { var delegate : MyViewDelegate? override func keyDown(event: NSEvent) { let character = Int(event.keyCode) switch character { case leftArrowKey, rightArrowKey: break default: super.keyDown(event) } } override func keyUp(event: NSEvent) { let character = Int(event.keyCode) switch character { case leftArrowKey: delegate?.didPressLeftArrowKey() case rightArrowKey: delegate?.didPressRightArrowKey() default: super.keyUp(event) } } override var acceptsFirstResponder : Bool { return true } }
- 将 Interface Builder 中 ViewController 视图的 class 更改为
MyView
在ViewControllerclass中添加协议
MyViewDelegate
——例如class ViewController: NSViewController, MyViewDelegate {
在
viewDidLoad()
中添加let view = self.view as! MyView view.delegate = self self.nextResponder = view
实现以下委托方法并添加代码以切换图像
func didPressLeftArrowKey() { println("didPressLeftArrowKey") // process keystroke left arrow } func didPressRightArrowKey() { println("didPressRightArrowKey") // process keystroke right arrow }
- 将 Interface Builder 中 ViewController 视图的 class 更改为
释放适当的箭头键时调用委托方法