6

たとえば、他の iPhone からの Bluetooth メッセージの受信を処理するモデル クラスがあります。これらのメッセージのいずれかを受け取ったら、ビューを更新する必要があります。これを行う標準的な方法は、View Controller を使用することだと思います。ビュー コントローラーはモデルとビューへの参照を持っているため、それぞれと通信できます。

しかし、どのようにメッセージを VC に送り返す必要があるでしょうか? それらはそれぞれView Controllerへの参照を持つことができます(プロパティとして、保持ではなく割り当てを使用)。それは悪い習慣ですか(私が間違っていなければ循環参照です)?
これを行う別の方法はありますか?私はデリゲート パターンを検討しましたが、デリゲート全体とすべてを記述することは、単純な問題に対して非常に多くの作業のように思えます。または、私が考えすぎていると思われる場合は、お気軽にお知らせください。

[この質問はおそらく以前にもあったと思います。かなり一般的なようですが、少し検索してもあまり見つかりませんでした]

ご協力いただきありがとうございます、

4

2 に答える 2

7

一般に、3 つの異なるテクニックがあります。

  1. 委任
  2. KVO (キー値観測)
  3. 通知

モデルが 1 つのオブジェクト (View Controller) に変更を通知するだけでよい場合は、委譲が最適です。新しいインターフェイスを作成したり、デリゲート プロパティをモデルに追加したりするのは余分な作業のように感じるかもしれませんが、柔軟性、コードの再利用、設計などの点では、それだけの価値があることは間違いありません。委任は Cocoa プログラミングの標準パターンであり、 Apple の API で広く使用されています。

モデルが複数のオブジェクトに変更を通知する必要がある場合は、KVO または通知を使用します。KVO を使用すると、モデルの特定のプロパティまたはキーの変更イベントをサブスクライブできます。たとえば、モデルの「メッセージ」プロパティが変更された場合、アタッチされたリスナーは変更を通知され、それに応じて応答できます。

通知は、アプリケーション全体のメッセージを複数のリスナーに送信する場合に使用されます。標準 API の例としては、キーボード通知 (キーボードの表示/非表示) やインターフェイスの向きの変更があります。

したがって、あなたの場合、委任または KVO がおそらく最良の選択です。

于 2011-05-30T09:48:42.813 に答える
0

iOS アプリケーションでこれを行ったことはありませんが、一般的な mvc 用語では、モデルから直接ビューを更新する方が理にかなっている場合があります (そしてコードをよりクリーンに保ちます)。これは私の意見では問題ありませんが、モデルをビューに結び付けてしまい、これは悪いことです。したがって、これを解決するには、observer(broadcast-receive) デザイン パターンを実装する必要があります (または、組み込みの ios イベント ブロードキャスター/レシーバー システム -> NSNotificationCenter を使用します)。このようにして、モデルを変更する何かが発生すると、誰かがそのイベントをリッスンするかどうかに関係なく、モデルはイベントをブロードキャストします。それはもはや問題ではないため、ビューをモデルから切り離します。

于 2011-05-30T09:42:07.257 に答える