ターゲットアクション
ターゲット·アクションは、イベントが発生したときに他のオブジェクトにメッセージを送信するために必要な情報をその中にオブジェクトが保持しているデザインパターンです。保存された情報はデータの二つの項目から成り立っています:アクションセレクタ、呼び出されるメソッドを識別する、そしてターゲット、メッセージを受信するオブジェクトです。イベントが起こった時に送られるメッセージはアクションメッセージと呼ばれます。ターゲットは任意のオブジェクトであっても、フレームワークオブジェクトであっても良いですが、それは、典型的には、アプリケーション固有の方法でアクションメッセージを処理するカスタムコントローラです。
アクションメッセージを引き起こすイベントは、メッセージを送るオブジェクトがどんなオブジェクトであってもいいのと同じように、何でもよいのです。たとえば、ジェスチャー認識オブジェクトが他のオブジェクトにそのジェスチャーを認識するとアクションメッセージを送信することがあります。ただし、ターゲット·アクション·パラダイムは、最も一般的に、ボタンやスライダーなどのようなコントロールに見られます。ユーザがコントロールオブジェクトを操作すると、指定されたオブジェクトにメッセージを送信します。コントロールオブジェクトは、(AppKit の) NSControl または (UIKit の) Uicontrol のサブクラスのインスタンスです。アクションセレクタとターゲットオブジェクトは両方ともコントロールオブジェクトのプロパティで、AppKit フレームワークの中にあり、コントロールのセル・オブジェクトのプロパティです。
アクションメソッドは、特定の形式でなければなりません。
アクションメソッドは、従来のシグネチャを持つ必要があります。UIKit フレームワークは、署名のいくつかのバリエーションを許可しますが、両方のプラットフォームとも、次のようなシグネチャを持つアクションメソッドを受け入れます。
型修飾子である IBAction は、アクションとして Interface Builder がその接続目的を認識しているように、空値(void) 戻り値として宣言されたメソッドにフラグを付け、その代わりに使用されます。Interface Builder で表示されるアクション・メソッドの場合、最初クラスのヘッダーファイルでそれを宣言する必要があり、そのクラスのインスタンスはアクションメッセージを受信します。
sender パラメータは、アクションメッセージを送信するコントロール・オブジェクトです。アクションメッセージに応答するときに、アクションメッセージを引き起こすイベントのコンテキストに関する詳細な情報を取得するために、sender に問い合わせることができます。
コードやツールの使用でターゲットとアクションを設定
プログラムまたは Interface Builder 内でコントロール(またはセル) オブジェクトのアクションとターゲットを設定できます。これらのプロパティを設定すると、効果的にアクションを介して、コントロールとそのターゲットに接続できます。Interface Builder 内のコントロールとそのターゲットを接続すると、接続は nib ファイルに保管(アーカイブ)されます。アプリケーションが後で nib ファイルをロードすると、接続が復元されます。
あなたはアクションメッセージのターゲットを nil に設定できます。この場合、アプリケーションは、実行時にターゲットを決定し、第一応答者(ファースト・レスポンダ) にアクションメッセージをまず送信し、それが処理されるまで(それがある場合)、そこからそれは レスポンダチェーンを上って行きます。
ターゲットアクションは iOS と OS X で異なっている
概念的にターゲット・アクション・デザインパターンは、両方のフレームワークで同じですが、UIKit と AppKit フレームワークは、実装の仕方が違います。
- AppKit は(すべてではないが) ほとんどのコントロール用のターゲットアクションを実装するためのコントロール・セルアーキテクチャを使用します。このアーキテクチャでは、コントロールは、複数の軽量セルオブジェクトを"所有" し、セルは、そのコントロールのためにターゲットとアクションプロパティを保持しています。ユーザーがクリックするか、そうでなければコントロールをアクティブにすると、そのセルからこの情報を抽出し、アクションメッセージを送信します。
- UIKit の場合、コントロールがコントロール上で発生する可能性のある複数のマルチタッチイベントにターゲットとアクションをマッピングします。
- UIKit はアクションメソッドのために、いくつかの異なる署名を可能にします。たとえば、次の署名が許されます。
前提条件の記事
セレクタ
コントロール・オブジェクト
関連記事
レスポンダ・オブジェクト既知のディスカッション
ターゲット・アクション(ココア・基礎的ガイドの)
サンプルコードプロジェクト
FunHouseMenuMadness