我需要按箭头键,但keyDown不会调用(Swift)

时间:2015-07-31 14:20:45

标签: swift keydown

我正在尝试构建一个显示图像的Mac App,当我按下右箭头键时我想继续下一个图像。我已经遍布stackoverflow和互联网,但似乎无法得到它。

我尝试了什么...... 我尝试使用keyDown(theEvent: NSEvent)但是当我按任意键时它不会调用。我相信这是因为它不属于某种文本领域,但不确定。

发生了什么...... 当我测试程序时,我按一个键(keydown函数准备好println("Key Pressed")),我得到OS X拒绝噪音没有打印到控制台。

我听说有些人将NSView子类化为覆盖acceptsFirstResponder,但我不熟悉子类化,所以任何指向我的方向都会很棒。或者,如果有一种方法可以做到无需继承NSView,那就太棒了!

提前致谢!对于noobness抱歉。

1 个答案:

答案 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
        }
      } 
    
    • 将Interface Builder中ViewController的视图类更改为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
      }
      

释放相应的箭头键时调用委托方法