6

ObjAがボタンを押すとObjBにデリゲートメッセージを送信するシナリオがあります。Obj Bは、デリゲート呼び出しに基づいて何らかのアクションを実行します。

Obj Aは、デリゲートメッセージが呼び出された後に発生した結果に基づいて、画面に何かを表示したいと考えています。

Obj Bが、そのアクションが何回発生したかを示すカウンターを維持していると言います。

したがって、Obj Aがボタンを押してデリゲートメソッドを呼び出すとき、そのデリゲートメソッドが値(私の場合は現在のカウンター)を返すのは良い考えですか?

ObjAがカウンターで更新された値を表示できるようにします。

この場合、同じメッセージがデリゲートとデータソースの両方として機能しています。

私にとって、Obj Aはビューであり、ObjBはビューコントローラーです。

私の実装には欠陥がありますか?

4

3 に答える 3

5

私はあなたの実装が好きです。

デリゲートとデータソースの役割を区別しない場合でも、より単純な方法でそれらを結合します。

MVCの概念に関する限り、実装する適切な方法は次のとおりだと思います。

  • A (ビュー) が B (デリゲート) に「私はタップされました」などのメッセージを送信します。

  • B (デリゲート) は必要に応じて動作し、「reloadData」というメッセージを A に送り返します。

  • A は、表示するデータを (現在のデータ ソースとして) B に要求します。

あなたの場合、デリゲートとデータソースは同じオブジェクトであるため、他の多くの場合と同様に、フローを実装することは非常に妥当であり、まったく問題がないように思えます。

  • A (ビュー) は B (デリゲートとデータ ソース) にメッセージを送信し、ビューを更新するために必要なデータ情報を受け取ります。
于 2013-03-19T11:54:45.260 に答える
3

いいえ、多くの場合、void ではなく値を返します。

これは有効で一般的に使用されるアプローチです.. 1つの例はUITextViewのデリゲートです:

- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text;

しかし、他の多くのコンポーネントはこれを行うため、あまり特殊化する必要はありませんが、汎用のままにすることができます

于 2013-03-19T11:48:06.027 に答える
2

いいえ、デリゲートが void を返すのはルールではありません。

void 以外の値を返す多くのデリゲートがあります。

- (BOOL)application:(NSApplication *)sender
    openFile:(NSString *)filename;                        // NSApplication
- (BOOL)application:(UIApplication *)application
    handleOpenURL:(NSURL *)url;                           // UIApplicationDelegate
- (UITableRowIndexSet *)tableView:(NSTableView *)tableView
    willSelectRows:(UITableRowIndexSet *)selection;       // UITableViewDelegate
- (NSRect)windowWillUseStandardFrame:(NSWindow *)window
    defaultFrame:(NSRect)newFrame;                        // NSWindow
于 2013-03-19T11:50:43.940 に答える