2009-07-01 19 views
2

以下はサンプルコードです。- (void)keyDown:(NSEvent *)イベントが機能しない

- (void) keyDown: (NSEvent *) event 
{ 
    NSString *chars = [event characters]; 
    unichar character = [chars characterAtIndex: 0]; 

    if (character == 27) { 
     NSLog (@"ESCAPE!"); 
    } 
} 

InterfaceBuilderやその他のバインディングで代理人を設定する必要がありますか?

ヘルプおくる...

+2

keyDown:メソッドはどこに実装されていますか? –

+0

エスケープキーを処理する必要がある場合は、 'NSResponder'サブクラスで' cancelOperation: 'をオーバーライドすることを検討してください。 – Andriy

答えて

4

keyDownは、そのオブジェクトファーストレスポンダとして設定されているNSViewサブクラスでオーバーライドする必要があります。レスポンダチェーンでイベントを渡すべきですが、確実にそのオブジェクトが最初にレスポンダであることを確認してください。

+0

これらの貴重な情報をお寄せいただきありがとうございます... –

0

ココアでは、このイベントのレスポンダーチェーンにのみ参加します。だから、いくつかのビューメソッドをオーバーライドする必要があります。簡単な方法は、特定のイベントを処理して使用するためにどのビューが最初のレスポンダーであるかを調べることです。

ウィンドウは、レスポンダチェーンを処理するか、レスポンダチェーンまで渡すことができる最初のレスポンダにkeyDown(with:) strightを送信します。すべてのビューがイベントを上回るわけではありません。 NSCollectionViewはキーイベントを渡しません。代わりにバンプ音が鳴ります。

対応するキーは、キー相当のread more hereである可能性があります。その場合は、代わりにこのタイプのイベントを受け取るためにperformKeyEquivalent(with:)メソッドをオーバーライドする必要があります。このイベントは、誰かがそれらを処理するまで、ウィンドウからすべてのサブビューに渡されたkeyDownイベントとは異なります。

NSCollectionView keyDown(with:)メソッドは、キーイベントをレスポンダチェーンに渡すことはしません。そのようなイベントをスーパービューの1つで処理するには、コレクションビューで最初にオーバーライドし、自分で処理したいイベントに対してself.nextResponder?.keyDown(with:event)を呼び出すことによって手動でイベントを送信する必要があります。