CocoaBindingsを理解するのに問題があります。誰かが私にこれが何であるかを人間が知覚できる方法で説明できますか?
2 に答える
Bindings は、多くのグルー コードを記述せずにビューをコントローラーに接続して、明示的に相互に対話させるためのシステムです。両方のクラスでプロパティを設定し*、IB でバインディングを接続するだけです。
従来のアプローチでは、ビューにはコントローラーと対話するための 1 つ以上のアウトレット (最も一般的な例はdelegate
とtarget
) があり、コントローラーにはビューと対話するためのアウトレットがあります。コントローラーがモデルを更新すると、(たとえば) が送信されます[view modelChange:newModelObject]
。ビューがモデルを更新する場合、NSText などのデリゲート メッセージをそのデリゲート (コントローラー) に送信しますtextDidChange:
。
バインディングを使用すると、コードで行う必要があるのは、ビューにプロパティを実装し、コントローラーにプロパティを実装してから、ビューの 1 つ以上のプロパティをバインディングとして公開することだけです*。あとはバインディングを接続するだけです。Cocoa クラスの場合、これは簡単です。IB でセットアップするだけです。独自のカスタム クラスの場合は、メッセージを自分で作成することになるでしょうbind:toObject:withKeyPath:options:
(それほど難しくはありません)。
繰り返しますが、Bindings を使用すると、(ほとんどの場合) グルー コード全体[view bind:@"viewProperty" toObject:self withKeyPath:@"controllerProperty.modelProperty" options:options];
がコントローラー内にあります。他のすべては、舞台裏のバインディングと KVO システム、およびプロパティのアクセサーによって処理されます。
欠点は、Cocoa Bindings の要件に厳密に従う必要があることです。これらは単純ですが、多くの古いアプリケーションは Cocoa Bindings に適合しないように設計されています。
- プリミティブ オブジェクト (辞書の配列など) を渡すだけでなく、実際のモデル オブジェクトを作成する必要があります。Core Data を使用している場合、これは簡単です。管理対象オブジェクトはモデル オブジェクトです。
- アクセサーを正しく記述するか、正しいアクセサーを合成する必要があります。たとえば、NSString プロパティは常に
@property(copy)
, neverである必要があり@property(retain)
ます (そうしないと、他の人の変更可能な文字列を保持していることに気づき、それを保持している間に変更されます)。 - モデル オブジェクトのプロパティは、そのプロパティ ( ) またはアクセサ メッセージ ( ) によってのみ変更する必要があり、インスタンス変数に直接アクセスすることはできません。(アクセサ メソッド自体は、インスタンス変数に直接アクセスする必要があるため、独自に作成した場合は明らかな例外です。)
model.foo = bar
[model setFoo:bar]
次の 2 つの利点があります。
- 大量のグルー コードを削除することなく、まったく新しいビュー クラスを作成できます。削除する必要がある
bind::::
のは、古いビューのプロパティに関するいくつかのメッセージです。数年後、現在のビューではアプリケーションの今後の機能に対応できないと判断した場合、これにより、最小限の苦痛でそれを取り除いて新たに始める柔軟性が得られます。 - さらに重要なことは、読む必要のあるコードが少ないほど、読みやすくなります。
*そして、ドキュメンテーションによると、ビュー クラスにKVO 観測メソッドを実装しますが、実際にこれを行う必要はありませんでした。ドキュメントのバグを報告しました。
2009-03-07 追加:ああ、引用を見つけました。「NSView サブクラスは、追加のキー値コーディング/キー値観察準拠のプロパティをバインディングとして公開できます。これには、各プロパティのクラス メソッド公開バインディング: を呼び出します。」—<a href="http://developer.apple.com/documentation/Cocoa/Reference/ApplicationKit/Protocols/NSKeyValueBindingCreation_Protocol/Reference/Reference.html" rel="noreferrer">NSKeyValueBindingCreation を実装する必要はありません。 KVO観察法。
以前の回答は非常に包括的で優れています。特にCocoaやObjective-Cを使用せずに、そのコアが何であるかを説明する回答を追加すると思いました。これは、Objective-C のような動的言語はC++ のような静的言語よりもはるかに簡単ですが、概念自体は言語にとらわれないためです。
例
2 つのオブジェクトMとVがあるとします。Mにはメソッドがあります。
setX(int x);
setY(int y);
int getX();
int getY();
Vにはメソッドがありますが:
setA(int x);
setB(int y);
int getA();
int getB();
これを見る 1 つの方法は、Mにはプロパティxとyがあり、Vにはプロパティaとbがあるということです。プロパティxを変更するとプロパティbが変更され、yが変更されると a が変更されるとします。
プロパティxの変更とは、たとえば次のことを意味します。
M.setX(10)
以前どこで
M.getX() != 10
したがって、 MでsetXを呼び出すと、VでsetAが呼び出されるようにする必要があります。
バインディングで言えることは、オブジェクトVのプロパティbがオブジェクトMのプロパティxにバインドされているということです。そして、この更新は自動的に処理されます。コーダーとして、 xが変更されたかどうかをチェックするコードを記述してから、 VでsetBを呼び出す必要はありません。バインディングはこれを自動的に処理します。
概要
バインディングを使用すると、2 つの異なるオブジェクトに存在する 2 つのプロパティを一緒にバインドできるため、プロパティの 1 つの値を変更すると、他のオブジェクトの依存プロパティが同じ値に変更されます。