レスポンダ・オブジェクト
レスポンダは、イベントに応答し、それらを扱うことができるオブジェクトです。すべてのレスポンダオブジェクトは、最終的には NSResponder (AppKit フレームワーク) または UIResponder (UIKit フレームワーク) を継承するクラスのインスタンスです。これらのクラスは、イベント処理のためのプログラムインターフェイスを宣言し、レスポンダのデフォルトの動作を定義します。 アプリケーションの可視オブジェクトは、ほとんどの場合、レスポンダであり-例えば、ウィンドウ、ビュー、そしてコントロールーそしてアプリケーションオブジェクトも同様にレスポンダです。iOS では、ビューコントローラ(UIViewController オブジェクト) も、レスポンダオブジェクトです。
イベントを受信するには、レスポンダは適切なイベント処理メソッドを実装する必要があり、場合によっては、それがファーストレスポンダになることができるとアプリケーションに伝えます。
ファーストレスポンダは、いくつかのイベントを最初に受信
アプリケーションでは、沢山の種類のイベントを最初に受信するレスポンダ・オブジェクトは、ファースト・レスポンダ として知られています。それは、キーイベント、アクションメッセージを受信し、ほかの種類のイベント- UIKit では、モーションとリモートコントロールのようなイベントを受信します。(マウスイベントとマルチタッチイベントは最初にマウスポインタまたは指の下にあるビューに移動し、そのビューは、ファーストレスポンダであるかもしれないし、そうではない場合もあります) ファースト・レスポンダは、一般的に、アプリケーションがイベントを処理するのに最適と判断したウィンドウ内のビューです。イベントを受信するには、レスポンダは、ファースト・レスポンダになるためにその意思を示す必要があり、プラットフォームごとに異なる方法でこれを行います。
// OS X
- (BOOL)acceptsFirstResponder { return YES; }
//IPhone OS
- (BOOL)canBecomeFirstResponder { return YES; }
イベントメッセージを受信することに加えて、レスポンダは、ターゲット指定がないアクションメッセージを受信できます。(アクションメッセージは、ユーザーがそれらを操作する時、ボタンや、コントロールなどのコントロールによって送信されます。)
レスポンダチェーンは協調イベント処理を有効に
ファーストレスポンダがイベントやアクションメッセージを処理できない場合には、レスポンダチェーン と呼ばれるリンクされたシリーズで、"次のレスポンダ" に転送します。レスポンダチェーンは、レスポンダオブジェクトに、アプリケーション内の他のオブジェクトへイベントやアクションメッセージを処理するための責任を転送できます。レスポンダチェーン内のオブジェクトがイベントやアクションを処理できない場合は、チェーン内の次のレスポンダにメッセージを再送信します。それが処理されるまで、メッセージは、上位レベルのオブジェクトに向かって、チェーンを上がって行きます。それが処理されなかった場合、アプリケーションはそれを破棄します。
イベントのパス。イベントの一般的なパスは、マウスポインタや指の下のビューかファーストレスポンダであるビューから始まり、レスポンダチェーンを上って行きます。そこからは、ウィンドウオブジェクトと、それからグローバルアプリケーションオブジェクトへとビュー階層を上に向かって進んで行きます。しかし、iOS でのイベントのレスポンダチェーンは、このパスにバリエーションを追加します。ビューがビューコントローラによって管理されている場合に、ビューがイベントを処理できない場合は、ビューコントローラーが、次のレスポンダになります。
アクションメッセージのパス。アクションメッセージの場合は、OS X と iOS の両方の場合、他のオブジェクトへとレスポンダチェーンを拡張します。OS X では、アクションメッセージのレスポンダチェーンは、ドキュメント·アーキテクチャに基づいたアプリケーションにより異なり、ウィンドウコントローラ(NSWindowController) を使用しているアプリケーションと、それらのカテゴリのどちらにも合わないアプリケーションです。その上、Mac アプリがキーウィンドウとメインウィンドウの両方を持っている場合、アクションメッセージがそれに沿って移動するレスポンダチェーンは、両方のウィンドウのビュー階層を伴うことがあります。
前提条件の記事
ビュー階層
関連記事
ユーザーイベント(OS X)
ターゲット・アクション
既知のディスカッション
ココアイベント処理ガイド
サンプルコードプロジェクト
ClockControl
Dicey