2009-02-28 14 views
31

これを要約すると、nibファイルの「最初のレスポンダー」はオブジェクトで、ユーザーのフォーカスがあるUIコントロール要素を表します。したがって、ユーザーがコントロールをクリックすると、UIコントロールをクリックしたペン先がFirst Responderとして設定されます。私のアプリではペン先から "First Responder"へのアウトレットを作ることができたので、たとえば、ユーザーがクリックして起動したものに "red font color"というメッセージを送ることができます。「最初のレスポンダー」 - 私はそれを得ましたか?

このFirst Responder UIコントロールがそのメッセージを理解できない場合、親要素または祖父母(など)UIコントロール要素がメッセージを理解するまで、レスポンダチェーンでメッセージが渡されます。それ以外の場合は無視されます。

したがって、First Responderは常にフォーカスを持つUIコントロールへの「リンク」を確立します。そうですか?

答えて

42

右全体の画像、最初の段落で間違った実装の詳細。

NibFileで "ファーストレスポンダは、" オブジェクトである

...

はありません、実際には、ファーストレスポンダはnilです。ペン先のFirst ResponderにUIコントロール(たとえば、ボタン)を接続することは、[control setTarget:nil]と同じです。

nibウィンドウのFirst Responder偽オブジェクトの理由は、IBではターゲットとアクションを同時に設定する(Ctrlキーを押しながらドラッグしてポップアップメニューからアクションを選択する)。あなたはコード内でできるように、アクションを設定してターゲットを未設定のままにすることはできませんので、それをnilに設定するには、明示的に行う必要があります。これはファーストレスポンダーのためのものです。それはnilを表す擬似オブジェクトであるため、特定の実際のターゲットに設定するときと同じ方法でターゲットとアクションを設定できます。

もちろん、他のものをnilに設定することはできません。ビューのターゲットのみです。 First Responderを意味するためにのみ使用できます。 UIコントロールのユーザーklicks場合、ペン先が設定されますので、

...

ペン先には何もしません。これは、ディスクに保存されたオブジェクトのフリーズドライコレクションです。 NSNibをインスタンス化しても、いくつかのオブジェクトを解凍するだけです。それは物事を行う物です。

ペン先からFirst Responderに接続したコントロールを保存解除すると、そのターゲットはnilに設定されます(覚えておいてください、First Responderの実際のターゲットは:nilです)。コントロールのターゲットがnilで、ユーザーがそれをクリックすると、その時点で最初のレスポンダーであるレスポンダにアクションが送信されます。

2番目と3番目の段落は正しいです。

+0

ありがとうございます。あなたは "ターゲット"の意味を説明できますか? – Thanks

+0

http://developer.apple.com/documentation/Cocoa/Conceptual/CocoaFundamentals/CommunicatingWithObjects/chapter_6_section_5.html#//apple_ref/doc/uid/TP40002974-CH7-SW31 –

+0

@Peter、上記のコメントにあなたのリンクが壊れています – Casebash

2

このリンクをチェックすると、説明がうまくいきます。

FirstResponderが イベントに応答する機会を与えられているレスポンダチェーンの最初のオブジェクト がある:ソースから

http://cocoadev.com/FirstResponder

:私はあなたがそれの要点を持っていると思います。

+1

ここに投稿されたリンクは現在壊れています – GoreDefex

3

あなたの理解は不完全です。 responder chainには、現在のドキュメントを含め、私たちが通常「UIコントロール」と考える以上のものが含まれています。大きなメリットの1つは、現在のウィンドウ、現在のテキストフィールド、現在のドキュメントなど、概念的に「現在の」ものと対話することができます。

2

レスポンダはイベント(ボタンのクリックなど)が発生したときにアクション(コール関数)を実行するオブジェクトです。レスポンダーチェーンは、それぞれが相互に含まれる一連のオブジェクトです。たとえば、ウィンドウ内のパネル内のボタンです。イベントが発生すると、レスポンダがnilに設定されていないオブジェクトが見つかるまでチェーンを反復処理し、イベントに応答することができます。したがって、ウィンドウ内の各ボタンに対してレスポンダオブジェクトを提供する代わりに、ウィンドウ全体に対して単一のレスポンダを提供することができます。最初のレスポンダーは、レスポンダーチェーン内の最初のオブジェクトです。イベントを最初のレスポンダーにリンクすると、イベントはチェーンを通過できます。

関連する問題