我正在尝试构建一个显示图像的Mac App,当我按下右箭头键时我想继续下一个图像。我已经遍布stackoverflow和互联网,但似乎无法得到它。
我尝试了什么...... 我尝试使用keyDown(theEvent: NSEvent)
但是当我按任意键时它不会调用。我相信这是因为它不属于某种文本领域,但不确定。
发生了什么...... 当我测试程序时,我按一个键(keydown函数准备好println("Key Pressed")
),我得到OS X拒绝噪音没有打印到控制台。
我听说有些人将NSView子类化为覆盖acceptsFirstResponder
,但我不熟悉子类化,所以任何指向我的方向都会很棒。或者,如果有一种方法可以做到无需继承NSView,那就太棒了!
提前致谢!对于noobness抱歉。
答案 0 :(得分:6)
子类化并不像看起来那么困难。
一般假设:键盘将在NSViewController子类的视图中接收并在视图控制器类中处理
MyView
的新Cocoa类作为NSView
用
替换创建的类的内容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
}
}
MyView
在ViewController类中添加协议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
}
释放相应的箭头键时调用委托方法