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

< Previous PageNext Page >

バインディング

バインディングは、アプリケーションのデータの表示と格納を同期化するCocoaテクノロジーです。Cocoaツールボックスの中で、オブジェクト間の通信を可能にする重要なツールです。Cocoaテクノロジーは、Model-View-Controllerとオブジェクトモデリングの両方のデザインパターンを応用しています。((“「Model-View-Controllerデザインパターン」”コントローラオブジェクトの解説の中でバインディングについて取り上げています)。これにより、値を表示するビューオブジェクトの属性と、その値を格納するモデルオブジェクトプロパティの間の間接的な接続、つまり「バインディング」を確立することができます。接続のどちらか一方の値に変更が生じた場合、その変更はもう一方にも自動的に反映されます。この接続を仲介するコントローラオブジェクトは、選択管理、プレースホルダー値、ソート可能なテーブルなど、追加のサポートを提供します。

In this section:

バインディングの仕組み
バインディングを確立する方法


バインディングの仕組み

バインディングは、Model-View-Controller (MVC)とオブジェクトモデリングのデザインパターンによって定義される概念上の空間に存在します。MVCアプリケーションは、オブジェクトに総称的な役割を割り当て、その役割に基づいてオブジェクトどうしの分離を維持します。オブジェクトは、ビューオブジェクト、モデルオブジェクト、コントローラオブジェクトのいずれかであり、その役割は簡単に次のように表せます。

すべてのオブジェクト(ただし最も重要なのはモデルオブジェクト)に、そのオブジェクトを定義するプロパティと呼ばれるコンポーネント(特性)があります。プロパティは2種類あります。1つは属性、すなわち文字列などの値、スカラー、データ構造体であり、もう1つは、他のオブジェクトとの関係です。関係は、1対1と、1対多の2種類が考えられます。さらに、関係には双方向型と再帰型があります。このようにアプリケーションのオブジェクトどうしは、相互にさまざまな関係を持っており、オブジェクトのこの網状構造をオブジェクトグラフと呼びます。プロパティには、キーと呼ばれる識別名が割り当てられます。キーパス(ピリオドで区切られたキーの並び)を使用して、オブジェクトグラフ内の関係をたどることで、関連するオブジェクトの属性にアクセスできます。

バインディングテクノロジーは、このオブジェクトモデルを使用して、アプリケーションのビューオブジェクト、モデルオブジェクト、コントローラオブジェクトの間でバインディングを確立します。バインディグを使用すると、オブジェクトモデルのオブジェクトグラフからアプリケーションのコントローラオブジェクトとビューオブジェクトへ、関係の網状構造を拡張することができます。ビューオブジェクトの属性と、モデルオブジェクトのプロパティの間に(通常はコントローラオブジェクトの仲介プロパティを介して)バインディングを確立することができます。表示されている属性値に変更があると、その変更はバインディングを通じて、値が格納されているプロパティに自動的に伝えられます。また逆に、プロパティの値に対する内部的な変更は、ビューに伝えられて表示されます。

たとえば、Figure 5-4は、スライダおよびテキストフィールドに表示されている値(これらのビューオブジェクトの属性)と、モデルオブジェクト(MyObject)のnumber属性の間に、コントローラオブジェクトのcontentプロパティを通じて設定された簡単なバインディングを示します。このようなバインディングが確立した状態では、ユーザがスライダを動かすと、値の変更はnumber属性に適用され、表示のためにテキストフィールドに返されます。


Figure 5-4  ビューオブジェクト、コントローラオブジェクト、モデルオブジェクトの間のバインディング

Figure 5-4 ビューオブジェクト、コントローラオブジェクト、モデルオブジェクトの間のバインディング

バインディングの実装は、バインディングを可能にするキー値コーディング、キー値監視、キー値の各メカニズムに基づいています。これらのメカニズムおよび関連する簡易プロトコルの概要については、“「キー値メカニズム」”を参照してください。“「Cocoaのデザインパターン」”のObserverパターンの説明の中でも、キー値監視について述べています。

バインディングは、任意の2つのオブジェクトの間に確立できます。唯一の要件は、オブジェクトは、キー値コーディングとキー値監視の規約に従わなければならないということです。ただし一般には、仲介コントローラを「経由」してバインディングを確立することをお勧めします。仲介コントローラオブジェクトは、選択管理、プレースホルダの値、保留中の変更の確定または破棄の機能など、バインディングに関連したサービスを提供するからです。仲介コントローラは、いくつかあるNSControllerのサブクラスのインスタンスです。これらはInterface BuilderのControllersパレットにあります(後述の“「バインディングを確立する方法」”を参照)。カスタム仲介コントローラクラスを作成して、より特化した動作をさせることもできます。仲介コントローラとNSControllerオブジェクトの詳細については、“「Model-View-Controllerデザインパターン」の”“「Cocoaのコントローラオブジェクトの種類」”、および“「Cocoaのデザインパターン」”のMediatorパターンのセクションを参照してください。

参考資料: ここで概説したデザインパターンの詳細については、“「Model-View-Controllerデザインパターン」”“「オブジェクトモデリング」”を参照してください。

バインディングを確立する方法

アプリケーションのモデルクラスのみがカスタムクラスである場合、バインディングを確立する際の唯一の条件は、バインドするすべてのプロパティに対してこれらのクラスがキー値コーディングの規約に従っていなければならないということです。カスタムビューまたはカスタムコントローラを使用している場合は、キー値監視にも従っている必要があります。キー値コーディングとキー値監視の両方に準拠するための要件の概略については、“「キー値メカニズム」”を参照してください。

注: Cocoaフレームワークのほとんどのクラスは、キー値コーディングと(該当する場合は)キー値監視に準拠しています。

プログラミングを通じてバインディングを確立することも可能ですが、ほとんどの場合はInterface Builderアプリケーションを使用してバインディングを確立します。Interface Builderでは、NSControllerオブジェクトをパレットからnibファイルへドラッグすることから開始します。次に、情報ウインドウの「Bindings」パネルで、アプリケーションのビュー、コントローラ、モデルの各オブジェクトのプロパティと、バインドしたい属性の間の関係を指定します。

Figure 5-5に、バインディングの例を示します。この図は、上のテーブルビューの「Name」カラムが、Entreesコントローラ(NSArrayControllerオブジェクト)のプロパティarrangedObjectsを通じて、モデル属性nameにバインドされている様子を示します。Entreesコントローラ自身も一連のモデルオブジェクトにバインドされています(図には示されていません)。


Figure 5-5  Interface Builderでのバインディングの確立

Figure 5-5 Interface Builderでのバインディングの確立

参考資料: バインディングテクノロジー、およびInterface Builderを使用してバインディングを確立する方法の詳細については、『Cocoa Bindings Programming Topics』を参照してください。これらのメカニズムの網羅的な説明については、『Key-Value Coding Programming Guide』および『Key-Value Observing Programming Guide』も参照してください。



< Previous PageNext Page >


Last updated: 2006-05-23




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