14

私は Java Swing UI のコーディングに慣れていて、変更するプロパティがあり、UI を更新したい場合は、observer/observable パターンを実装します。Java では、さまざまなイベントを通知するリスナーのリストをクラスに保持させることで、通常これを行います。

私は Mac で Objective-C を試してみましたが、これには KVC とバインディングがあり、非常にうまく機能しているようで、必要なコードが少なくて済みます。iPhone SDKにはこの機能がないようですが、私の質問は次のとおりです。変更されるデータを保持するクラスがある場合、UIコンポーネントをそのクラスに登録して通知できるようにする最良の方法は何ですか?表示する必要があるデータの変更?

4

3 に答える 3

37

Cocoaで監視を行うには、Key-Value監視と通知の2つの組み込みの方法があります。どちらのシステムでも、オブザーバーのコレクションを自分で維持または通知する必要はありません。フレームワークがそれを処理します。

Key-Value監視(KVO)を使用すると、オブジェクトのプロパティ(コレクションを表すプロパティも含む)を監視し、そのプロパティへの変更を通知できます。-addObserver:forKeyPath:options:context:更新を受信するオブジェクト、更新を受信するプロパティのキーパス(受信者に対する)、および受信する更新のタイプを渡すオブジェクトを送信する必要があります。(コレクションを表すプロパティを監視する場合に使用できる同様の方法があります。)

通知は古く、重みがあります。NSNotificationCenterイベントが発生したときに通知が渡されるオブジェクトとセレクターのペア(通常はデフォルトのセンター)に登録します。通知オブジェクト自体には、そのプロパティを介して任意のデータを含めることuserInfoができ、特定のオブジェクトに適用される通知ではなく、特定の名前のすべての通知を監視するように選択できます。

特定の場合にどちらを使用する必要がありますか?一般に、特定のオブジェクトの特定のプロパティへの変更を気にする場合は、Key-ValueObservingを使用します。それが設計されたものであり、意図的に軽量化されています。(他の用途の中でも、Cocoaバインディングが構築される基盤です。)プロパティによって表されない状態の変化を気にする場合は、通知がより適切です。

たとえば、ユーザーがモデルオブジェクトの名前を変更したときに同期を維持するには、KVOを使用します。オブジェクトグラフ全体がいつ保存されたかを知るために、通知を使用します。

于 2008-10-03T09:16:51.380 に答える
9

また、次のことができることもわかりました。

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(_handleWhateverChange) name:@"whateverChange" object:nil];

変更イベントに登録するには、および

[[NSNotificationCenter defaultCenter] postNotificationName:@"whateverChange" object:nil];

それらを発射します。私はN00bかもしれませんが、キーパスのオブザーバーを機能させることができませんでした。

于 2008-10-03T13:03:47.637 に答える
0

それは一般的に行われている方法ではありません。ここでの議論、特に Apple ドキュメントへのリンクを参照してください。

それでもあなたが言ったようにやりたいのであれば、バインディングのようなものを「手作業で」実装することは特に難しくありません。変更をサブスクライブする方法を認識し、ビューのプロパティに接続する「バインディング」オブジェクトを作成するだけです。

実際にそれがどのように行われたかを答えるために-通常、モデルの状態を監視するコントローラーオブジェクトがあり(オブザーバーのように機能します)、必要に応じてビューオブジェクトを更新します。

于 2008-10-03T06:04:50.793 に答える