我需要按下箭头键,但 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
      }
      

释放适当的箭头键时调用委托方法