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

jus*_*lbs 6 keydown swift

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

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

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

我听说有些人继承子类NSView来覆盖acceptsFirstResponder,但我是新的子类,所以任何你可以指出我的方向都会很棒.或者,如果有一种方法可以做到没有子类化NSView,这将是伟大的!

提前致谢!抱歉,这是一个noobness.

vad*_*ian 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
        }
      } 
    
    Run Code Online (Sandbox Code Playgroud)
    • 将Interface Builder中ViewController的视图类更改为 MyView
    • 在ViewController类中添加协议MyViewDelegate- 例如

      class ViewController: NSViewController, MyViewDelegate {
      
      Run Code Online (Sandbox Code Playgroud)
    • viewDidLoad()

      let view = self.view as! MyView
      view.delegate = self
      self.nextResponder = view
      
      Run Code Online (Sandbox Code Playgroud)
    • 实现以下委托方法并添加代码以切换图像

      func didPressLeftArrowKey() {
        println("didPressLeftArrowKey")
        // process keystroke left arrow
      }
      
      func didPressRightArrowKey() {
        println("didPressRightArrowKey")
        // process keystroke right arrow
      }
      
      Run Code Online (Sandbox Code Playgroud)

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