これを簡単に要約します。nibファイルの「FirstResponder」はオブジェクトであり、ユーザーのフォーカスを持つUIコントロール要素を表します。したがって、ユーザーがコントロールをクリックすると、ペン先はUIコントロールをクリックしたものをファーストレスポンダーとして設定します。私のアプリでは、ペン先からその「ファーストレスポンダー」へのアウトレットを作成できます。たとえば、ユーザーがクリックしてアクティブにしたものに「赤いフォントの色を作成」というメッセージを送信できます。
そして、このFirst Responder UIコントロールがそのメッセージを理解しない場合、親要素または祖父母(など)のUIコントロール要素がメッセージを理解するまで、メッセージはレスポンダーチェーンに渡されます。それ以外の場合は無視されます。
そのため、First Responderは、フォーカスのあるUIコントロールへの「リンク」を常に確立します。そうですか?
正しい全体像、最初の段落の間違った実装の詳細。
NibFileの「ファーストレスポンダー」はオブジェクトです…
いいえ、実際には、ファーストレスポンダーはnil
です。 UIコントロール(ボタンなど)をペン先のFirst Responderに接続することは、コードの[control setTarget:nil]
と同等です。
NibウィンドウにFirstResponderの偽のオブジェクトがある理由は、IBで、ターゲットとアクションを同時に設定するためです(Ctrlキーを押しながらターゲットにドラッグし、ポップアップメニューからアクションを選択します)。コードのようにアクションを設定してターゲットを未設定のままにすることはできないため、nil
に設定するには、明示的に設定する必要があります。これがFirstResponderの目的です。これは、nil
を表す偽のオブジェクトであるため、特定の実際のターゲットに設定する場合と同じ方法でターゲットとアクションを設定できます。
もちろん、これを使用して他のものをnil
に設定することはできず、ビューのターゲットのみを設定します。ファーストレスポンダーを意味するためにのみ使用でき、他には何も使用できません。
したがって、ユーザーがUIコントロールをクリックすると、Nibは…を設定します。
ペン先は何もしません。これは、ディスクに保存されているオブジェクトのフリーズドライコレクションです。 NSNibをインスタンス化する場合でも、実行しているのはいくつかのオブジェクトを解凍することだけです。物事を行うのはオブジェクトです。
手元のケースでは、First Responderに接続したコントロールをペン先からアーカイブ解除すると、そのターゲットはnil
に設定されます(First Responderが実際に何であるかを覚えておいてください:nil
のターゲット)。コントロールのターゲットがnil
であり、ユーザーがそれをクリックすると、その時点で最初のレスポンダーであるレスポンダーにアクションが送信されます。
2番目と3番目の段落は正しいです。
あなたの理解は不完全です。 レスポンダーチェーン には、現在のドキュメントを含め、通常「UIコントロール」と考えられる以上のものが含まれています。大きな利点の1つは、現在のウィンドウ、現在のテキストフィールド、現在のドキュメントなど、概念的に「現在の」ものを見つけるために多くのことをいじることなく操作できることです。
このリンクをチェックしてください。それは説明するのに良い仕事をします。私はあなたがそれの要点を持っていると思います:
http://cocoadev.com/FirstResponder
ソースから:
FirstResponderは、イベントに応答する機会が与えられるレスポンダーチェーンの最初のオブジェクトです。
レスポンダーは、イベント(ボタンのクリックなど)が発生したときにアクション(関数の呼び出し)を実行するオブジェクトです。レスポンダーチェーンは、それぞれが互いに含まれている一連のオブジェクトです。たとえば、ウィンドウ内のパネル内のボタンです。イベントが発生すると、レスポンダーがnil
に設定されていないため、イベントに応答できるオブジェクトが見つかるまで、チェーンを繰り返し処理します。したがって、ウィンドウ内の各ボタンにレスポンダーオブジェクトを提供する代わりに、ウィンドウ全体に単一のレスポンダーを提供できます。ファーストレスポンダーは、単にレスポンダーチェーン内の最初のオブジェクトです。イベントをファーストレスポンダーにリンクすると、イベントがチェーンを通過できるようになります。