2011-03-16 18 views
0

私は、NSWindowのサブビューとしてIKImageBrowserViewコンポーネントの使用を特徴とするプログラムを構築しています。補助ノートとして、ImageBrowserControllerというNSWindowをサブクラス化し、私のアプリケーションのNSWindowオブジェクトの代理人として設定されているコントローラオブジェクトがあります。NSWindowオブジェクトにNSWindowサブクラスである代理人がいる場合、受信したイベントを処理するのは誰ですか?

IKImageBrowserViewにメッセージsetCanControlQuickLookPanel:YESを送信して、IKImageBrowserViewがキーイベントを受信する最初のレスポンダである場合にQuickLook機能を使用して画像ファイルをプレビューするようにしました。それから、IKImageBrowserViewを最初にレスポンダにする方法を理解するのにはしばらく時間がかかりました。ImageBrowserControllerの中でacceptsFirstResponderをオーバーライドして最終的に作業しています。

NSWindowの代理人として、ImageBrowserControllerには、イベントがNSWindowでトリガーされた後のレスポンダチェーン内の場所があることを理解しています。そして、私はNSWindowのサブビューとして、IKImageBrowserViewがイベント処理のために渡されるイベントであることを理解しています。私が得られないのは、最初のレスポンダーであることと、何らかの形でIKImageBrowserViewに接続していることの間の接続です。ImageBrowserControllerです。 NSWindowまたはIKImageBrowserViewを最初のレスポンダとして明示的に設定しませんでした。だから私はなぜ私の内部でイベント処理を実装する必要はありませんImageBrowserController

EDIT:受け入れ答えはそれだろうと述べただけのようだから受け入れ答えを読んで、私は私のImageBrowserControllerとクイックルック機能でacceptsFirstResponderオーバーライドを削除しようとした私のコードに戻った後も引き起こしました。 setCanControlQuickLookPanel:YESをコメントアウトすると、スペースバーを使ってQuickLook機能を呼び出そうとしたときに、私にビープ音が鳴りました。私の問題は、自分のコード(sigh)に変更を加えた後に、[BUILD]ボタンの代わりに[RUN]ボタンを押したときのXcodeのユーザエラーによって引き起こされたと感じています。

答えて

2

オブジェクト間のやりとりに関して、あなたが言っていることのいくつかは意味をなさないものであり、何らかのバックグラウンドなしにあなたの記載された質問に対処するのは難しいです。

あなたが言うように、あなたのウィンドウデリゲートは、ウィンドウ自体の後にレスポンダチェーンのエンドに場所を持っています。あなたの欠点は、IKImageBrowserViewなどのGUI要素が、で始まり、指定されたウィンドウ内のいずれか1つが現在のfirstResponderである可能性があるということです。

アプリケーションがイベントを取得すると、そのイベントはキーウィンドウ(「キー」(つまり「キーストローク」)イベントを現在受け付けているウィンドウのみ)に渡されます。そのウィンドウは、firstResponderにイベントの処理を依頼することから始まります。そのオブジェクトが拒否した場合、イベントは自身のnextResponderに渡されます。通常は、イベントが処理されるかウィンドウオブジェクト自体まで一貫して渡されるまで、そのスーパービューが処理されるか、渡されます。そのときだけ、ウィンドウが(イベント自体を処理しない場合)そのデリゲートにイベントの処理を依頼します。

これは、ウィンドウデリゲートとIKImageBrowserView間の接続が唯一のResponder Chainを通じてであり、その性質はビューは、任意のイベントを処理するために拒否した場合、デリゲートが最終的にそれを処理するように要求することができるということだけであることを意味し、場合それらの間に他のオブジェクトは最初にそれを処理しません

あなたのウィンドウデリゲートはfirstResponderである必要はありません。 NORウィンドウデリゲートにacceptsFirstResponderをオーバーライドし、ウィンドウのサブビューの一つ上の任意の効果を持っています。*

あなたの窓のデリゲートはまたに(そして、実際にすべきではない)を必要としないNSWindowのサブクラスです。必要なのは、あなたが興味を持っているNSWindowDelegate Protocolのメソッドを実装するNSObjectのサブクラスであり、他のオブジェクトによって処理されない場合に捕捉したいイベントを処理するメソッドです。

最後に明示的な質問に対する答えは、(私はこのことを皮肉に言っているわけではありません)イベント自体を処理するには、ウィンドウデリゲートでイベント処理を実装する必要があります。


*:IKImageBrowserViewはすでにacceptsFirstResponderYES応答します。ウィンドウに他のサブビューがない場合は、アプリケーションが起動すると自動的にfirstResponderになります。このコンセントをInterface Builderで明示的に設定するには、ウィンドウのコンセントを任意のオブジェクトに接続します。

+0

@ josh-caswell - 答えをありがとう。あなたのご意見は、私が誤解していたことを理解するのに役立ちました。 – spade78

+0

素晴らしい!あなたがすでに知っていたことを私があなたに伝えているかどうかは完全にはわかりませんでした。それがうれしかったのでうれしいです。 –

関連する問題