2

アーキテクチャに関するアドバイスを利用できます。私は今、次の問題に何度か遭遇しましたが、それを解決するための本当にエレガントな方法を見つけたことがありません。

可能な限り最高レベルで説明されている問題
複数の子(すべて同じプロトコルを使用)のデリゲートとして機能したい親クラスがありますが、子が親のメソッドを呼び出すと、親はどちらかを認識しなくなります子供が電話をかけています。

直接呼び出しではなく、緩い結合(委任/プロトコルまたは通知)を使用したいと思います。複数のハンドラーは必要ないので、通知はやり過ぎかもしれません。

問題を説明するために、非常に単純化された例を試してみましょう
親ビューコントローラー(および対応するビュー)から始めます。3つの子ビューを作成し、それぞれを親ビューに挿入します。ユーザーが子の1つに触れるたびに、親のViewControllerに通知を受け取りたいです。親に通知するためのいくつかのオプションがあります。

  1. プロトコルを定義します。親はプロトコルを実装し、各子のデリゲートとして自分自身を設定します。ユーザーが子ビューに触れると、そのビューコントローラーはそのデリゲート(親)を呼び出します。この場合、親はビューがタッチされたことを通知されますが、どちらのビューかはわかりません。十分じゃない。

  2. #1と同じですが、プロトコルでメソッドを定義して、ある種の識別子も渡します。子供がそのデリゲートに触れられたことを伝えると、それは自分自身へのポインタも渡します。このようにして、親はどのビューがタッチされたかを正確に知ることができます。オブジェクトがそれ自体の参照を渡すのは本当に奇妙に思えます。

  3. NSNotificationsを使用します。親は、3つの子のそれぞれに個別のメソッドを定義し、通知の送信者として3つの子のそれぞれの「viewWasTouched」通知をサブスクライブします。子はユーザーディクショナリに自分自身を添付する必要はありませんが、スコープとして自分自身へのポインタを使用して通知を送信する必要があります。

  4. #4と同じですが、個別の方法を使用するのではなく、親は、通知の送信者と一緒にスイッチケースまたは他の分岐を使用する方法を使用して、どのパスを取るかを決定できます。

  5. 子ビューへのデリゲートとして機能する複数のman-in-the-middleクラスを作成し、子へのポインターまたはその他の差別化要因を使用して親のメソッドを呼び出します。このアプローチはスケーラブルではないようです。

これらのアプローチのいずれかがベストプラクティスと見なされますか?はっきりとは言えませんが、もっとわかりやすくエレガントなものが欠けているような気がします。

4

1 に答える 1

5

あなたの#2は、代表者のための標準的なCocoaパターンです。デリゲートプロトコルの各メッセージは、オブジェクトを最初の引数として受け取ります。たとえば、にはUITableViewDelegate、次のようなメソッドがあります。

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath;

テーブルビューがこのメッセージをデリゲートに送信すると、最初の引数としてそれ自体(テーブルビュー)が送信されます。デリゲートオブジェクトが複数のテーブルビューのデリゲートである場合、最初の引数を使用して、どのテーブルビューがメッセージを送信したかを把握できます。

他に引数がない場合でも、次のメソッドのように、メッセージはオブジェクトを引数として受け取りますUITableViewDataSource

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView;

このパターンは、CocoaTouchフレームワーク全体に見られます。UIPickerViewDelegate、、、UIImagePickerControllerDelegateおよびUINavigationControllerDelegateはほんの一例です。

やむを得ない理由がない限り、標準のパターンに従う必要があります。規則に従うと、他の人(そして将来のあなた)があなたのコードを理解しやすくなります。

于 2012-07-11T03:07:12.457 に答える