2009-06-20 15 views
3

Cocoaの新人として、私はジェネリックNSResponderサブクラスがキーイベントを実装しているように実装する理由を理解するのに苦労しています。なぜNSWindowまたはNSViewインスタンスはデリゲートではなく、独自のキーイベントを処理しますか?

私のプログラムでは、画面全体を占有するNSWindowサブクラスがあり、必ずキーイベントを処理する必要があります。プログラムの状態全体を変更することができるいくつかの主要なコマンドがあります(たとえば、ユーザーがスペースバーを押すとタイマーを一時停止するなど)。NSTextFieldハンドルのようなサブビューを持つのは意味がありません。

デリゲート(コントローラ)はこれらのイベントを取得する必要があります。代わりに、ウィンドウを(keyDown:interpretKeyEvents:セレクタを介して)コントローラに通知するために乱雑なグルーコードを書くか、コントローラのコードをNSWindowサブクラス自体に移動するだけで済むのです。

これは厄介で、私の腸は何かが欠けていると私に伝えます。よりクリーンなソリューションはありますか?

答えて

4

正しく設定した場合は、NSWindowの代理人がメッセージを受信します。 Cocoaはレスポンダチェーンを使用して、最初のレスポンダからのメッセージ(キーメッセージのキービュー)、クリックされた/表示されたビューなどを転送します。マウスメッセージのために - スーパービューを通して、ウインドウを通して、そして最終的にウインドウのデリゲートへ。 Apple's siteには、典型的なレスポンダーチェーンのかなり良い図があります。

ファンシーなウィンドウの描画やその他の行を実装していない限り、サブクラス化する必要はありません。NSWindow Cocoaは、NSWindowControllerクラスがウィンドウとその内容のコントローラとして動作するようにします。

普通のパターンはNSWindowControllerをサブクラス化してIBOutletを追加し、NIBを使用してウィンドウの内容をレイアウトします。 NSWindowControllerをInterface BuilderでFile's Ownerプロキシのクラスにサブクラス化します。またウィンドウのdelegateをウィンドウコントローラに割り当てて、ウィンドウがレスポンダチェーンの一部になるようにします。最後に、ウィンドウを作成するには、NSWindowControllerinitWithWindowNibName:メソッドを使用します。これは、新しいウィンドウコントローラをNIBにファイルの所有者としてロードする作業を自動化します。

あなたが探しているリンクが見つからないため、Cocoaのドキュメントのウィンドウコントローラを読むことをお勧めします。

+0

私の代理人は、実際にはNSWindowControllerサブクラスです。インタフェースビルダーを使用していないのは、インスタンス化時にボーダレスなウィンドウを作成しようとしているためで、IBがそのように見えない - さらに、詳細を学習しようとしているIBはたくさん隠れるので、このアプリでは "難しい方法"を学ぶ価値があると思った。 ドキュメントのそのセクションへのリンクありがとうございます。私はそれを読んだが、最後の手段であるNSWindowControllerに関する詳細を見逃した。明らかに私はレスポンダーチェーンを管理するのに間違いを犯しました。 – EricB

関連する問題