2011-01-29 11 views
2

私はkeydownアクションのためにすべてのコードを手に入れましたが、最初に私が行ったレスポンダの何をすべきか分かりません。誰も私にココアのobjectivecのkeydownアクションを認識するように設定する方法を教えてもらえますか?OSXのKeyDownアクション?

おかげ

答えて

4

まず、keyDown:は、イベントメッセージではなく、アクションメッセージです。その引数はNSEventであり、何らかのUIオブジェクト(NSControlやNSMenuItemなど)ではありません。

アクションメッセージはレスポンダチェーンを経由します。この場合、「ファーストレスポンダ」は特別なものではありません。各レスポンダは、それを処理する方法がわからないアクションメッセージを次のレスポンダに渡します。これが「レスポンダーチェーン」です。最初のレスポンダーは、レスポンダーチェーンの先頭にあるレスポンダーが何であっても、つまり、最初にレスポンダーになります。あなたは、単にそのチェーンにいる必要があります。それは、そのアクションに対応する方法を知らないものの背後にあるものです。

しかし、これはイベントメッセージなので、状況は異なります。 キービューwhich is the first responderになる必要があります。

これだけです。ビュー内のkeyDown:メッセージ(および関連する可能性のあるメッセージ)に応答する必要があり、そのビューはメッセージを受信する最初の応答者である必要があります。

NSResponder class referenceおよびCocoa Event-Handling Guideはさらに詳しく説明します。

0

これは私がやったことであり、うまくいきます。 (MacOSのシエラ用スウィフト3)

override func viewDidLoad() { 
    keyIsDown = false // variable defined in the NSViewController 

    NSEvent.addLocalMonitorForEvents(matching: .keyUp) { (aEvent) -> NSEvent? in 
     self.keyUp(with: aEvent) 
     return aEvent 
    } 

    NSEvent.addLocalMonitorForEvents(matching: .keyDown) { (aEvent) -> NSEvent? in 
     self.keyDown(with: aEvent) 
     return aEvent 
    } 
} 

は今、私はまた、これらを上書き:

override var acceptsFirstResponder: Bool { return true } 
override func becomeFirstResponder() -> Bool { return true } 
override func resignFirstResponder() -> Bool { return true } 

そしてこれら:

override func keyUp(with event: NSEvent) { 
    keyIsDown = false 
    if event.keyCode == 1 { 
     print("s key released") 
    } 
} 

override func keyDown(with event: NSEvent) { 
    if keyIsDown == true { 
     return 
    } 
    keyIsDown = true 
    // Whatever you'd like to do (check to see which key released, etc.) 
} 

あなたが始める必要があること。

関連する問題