Apple Developer Connection
Member Login Log In | Not a Member? Contact ADC

< 前ページ次ページ > 目次を隠す

オブジェクト通信のパス:アウトレット、ターゲット、アクション

Interface Builderでは、コントローラとそれ以外のオブジェクト(アウトレットやアクションなど)の間でやり取りされるメッセージのパスを指定します。次のセクションでは、Currency Converterユーザインターフェイスを実装するオブジェクトが、実行中のアプリケーションにおいて相互にどのようにやり取りするかについて説明します。

このセクションの内容:

アウトレット
Interface Builderのターゲット/アクション
どの方向に接続するか?


アウトレット

アウトレットは、オブジェクトを識別するインスタンス変数です。図 5-1に、あるオブジェクトのアウトレットが別のオブジェクトをどのように参照するかを示します。


図 5-1  あるオブジェクトから別のオブジェクトを参照するアウトレット

An outlet pointing from one object to another

オブジェクトはアウトレットにメッセージを送信することにより、アプリケーション内のほかのオブジェクトとやり取りできます。アウトレットは、アプリケーション内の任意のオブジェクトを参照できます。すなわち、テキストフィールドやボタンなどのユーザインターフェイス、ウインドウとダイアログ、カスタムクラスのインスタンス、さらにアプリケーションオブジェクト自身であっても可能です。アウトレットを区別しているものは、Interface Builderとの関係です。

アウトレットは次のように宣言されます。

IBOutlet id variableName;

注: IBOutletはNULL定義されたマクロであり、Cプリプロセッサがコンパイル時に削除します。Interface Builderでは、アウトレットを視覚的に結び付けるときにそれらを表示できるように、このマクロを使ってアウトレット宣言を識別します。

オブジェクトの型としてidを持つオブジェクトは、動的に型定義されます。つまりオブジェクトのクラスは実行時に決まります。id型を任意のオブジェクトに使用できます。動的に型定義されたオブジェクトのクラスは、実行時であっても必要に応じて変更できます。これはオブジェクト指向の熟練者であっても、刺激的なことであると同時に、慎重を要するという意識がかき立てられるでしょう。これは特に優れた機能であり、非常に効率よいメモリの使用が可能になりますが、オブジェクトに対してある型をキャストした場合に、オブジェクトがその型のメッセージに応答できないと、難解でデバッグしにくい問題をアプリケーションにもたらす可能性があります。

動的に型定義されたオブジェクトを必要としない場合は、オブジェクトへのポインタとして静的に型定義でき、ほとんどの場合はそのようにする必要があります。

IBOutlet NSButton* myButton;

通常は、オブジェクト間に接続線を引くことにより、Interface Builderでアウトレットのターゲットを設定します。アウトレット以外にもアプリケーション内のオブジェクトを参照する方法はいくつかありますが、アウトレットと、それらを初期化するInterface Builderの機能がより便利です。

アプリケーションのロード時に、アウトレットを表現するインスタンス変数が、対応するターゲットを指すように初期化されます。たとえば、ビューの為替レートから値を受け取るコントローラインスタンスのパラメータは、Exchange Rateテキストフィールドオブジェクトを基準に初期化されます(詳細については「ConverterControllerインスタンスをテキストフィールドに接続する」を参照してください)。アウトレットが接続されていないと、対応するインスタンス変数の値はnullになります。

接続について理解するには、目的のオブジェクトに電気のコンセントが接続されていると想像するとよいでしょう。また、ソースオブジェクトのアウトレットからは電気コードが延びているものと想像してください。接続がなされる前は、コードは接続されておらず、アウトレットの値はnullです。接続がなされる(コードが接続される)と、目的のオブジェクトへの参照がソースオブジェクトのアウトレットに割り当てられます。

Interface Builderのターゲット/アクション

Builderインスペクタの「Connections」パネルでターゲット/アクションの接続を表示し、完成させることができます。このパネルは使いかたは簡単ですが、ターゲットとアクションの関係ははっきり見えないことがあります。第一に、ターゲットは、アクションメッセージの受信者を識別するセルオブジェクトのアウトレットです。セルオブジェクトとは何かと、それがボタンと何の関係があるのか、疑問に思うでしょう。

コントロールオブジェクト(つまり、ボタンなどのNSControlから派生したオブジェクト)には、必ず1つまたは複数のセルオブジェクトが接続されています。コントロールオブジェクトは、アクションメソッドの呼び出しを「ドライブ」しますが、ターゲットとアクションはセルから取得します。NSActionCellは、ターゲットアウトレットとアクションアウトレットを定義し、Application Kitのほとんどの種類のセルがこれらのセルを継承します。

たとえば、ユーザが「Currency Converter」ウインドウで「Convert」ボタンをクリックすると、ボタンは必要な情報をそのセルから取得し、カスタムクラスConverterControllerのインスタンスであるconvertメソッドをターゲットアウトレットオブジェクトに対して呼び出します。図 5-2に、ConverterControllerクラス、「Convert」ボタン、「Amount in Other Currency:」フィールドの間のやり取りを示します。


図 5-2  ターゲット/アクションパラダイムにおける相互関係

Relationships in the target-action paradigm

「Actions」カラム(インスペクタの「Connections」パネル)で、すべてのアクションメソッドがターゲットオブジェクトのクラスによって定義され、Interface Builderによって認識されます。アクションメソッドの名前は次の構文に従っているため、Interface Builderはアクションメソッドを識別できます。

- (IBAction)myAction:(id)sender;

注: IBOutletと同様、IBActionはNULL定義されたマクロであり、Cプリプロセッサがコンパイル時に削除します。Interface Builderは、アクションを視覚的に結び付けるときにそれらを表示できるように、このマクロを使ってアクション宣言を識別します。

ここで、Interface Builderは引数senderを探します。

どの方向に接続するか?

通常、接続するアウトレットとアクションは、NSObjectのカスタムサブクラスに属します。このような場合は、どのような方法でInterface Builderで接続を指定するかを知るには、単に簡単な規則に従います。メッセージを送信するオブジェクトから、メッセージを受信するオブジェクトへの接続を作成するには、

これらは一般的なケースにおける経験則であって、すべての状況に当てはまるわけではありません。たとえば、多くのCocoaオブジェクトがdelegateアウトレットを持っています。これらを接続するには、Cocoaオブジェクトからカスタムオブジェクトへ接続線を引きます。

接続を明確にするもう1つの方法は、どのオブジェクトがどのオブジェクトを見つける必要があるかを考えることです。アウトレットの場合は、カスタムオブジェクトがほかのオブジェクトを探す必要があるため、接続はカスタムオブジェクトからほかのオブジェクトになります。アクションの場合は、コントロールオブジェクトがカスタムオブジェクトを探す必要があるため、接続はコントロールオブジェクトからカスタムオブジェクトになります。



< 前ページ次ページ > 目次を隠す


Last updated: 2008-01-24




Did this document help you?
Yes: Tell us what works for you.

It’s good, but: Report typos, inaccuracies, and so forth.

It wasn’t helpful: Tell us what would have helped.
Get information on Apple products.
Visit the Apple Store online or at retail locations.
1-800-MY-APPLE

Copyright © 2007 Apple Inc.
All rights reserved. | Terms of use | Privacy Notice