Cocoa Touchの代議員対イベント

私は最初のiPhoneアプリを書いています.Cocoa TouchとObjective-Cでデザインパターンを探求しています。私はクライアントサイドのWeb開発の背景から来ているので、私は代議員の周りに私の頭を包み込むことを試みています。

具体的には、イベントハンドラの代わりにデリゲートオブジェクトが必要な理由はわかりません。例えば、ユーザーがボタンを押すと、それはイベント( UITouchUpInside )で処理されますが、ユーザーがテキストボックスへの入力を終了し、「完了」ボタンを使用して閉じると、アクションはテキストボックスのデリゲート( textFieldShouldReturn )でメソッドを呼び出すことによって処理されます。

なぜイベントの代わりにデリゲートメソッドを使用するのですか?私はまた、 viewDidLoad メソッドを持つビューコントローラでこれに気付きました。なぜイベントを使用しないのですか?

5

3 答え

EDIT: Another good post: NSNotificationCenter vs delegation( using protocols )?

デリゲートはコールバックなので、1:1の関係があります。デリゲートは、正式なプロトコルを実装するオブジェクトの単一インスタンスです。

通知(イベント)は、基本的に何かが発生したときに関心のある多くのオブジェクトにブロードキャストされます。

デリゲートは、前後のコールバック、コントロールのデータソースの提供、ビュー間の通信など、他のオブジェクト処理のパイプラインにコードを挿入するのに適しています。

xcode iosプロジェクトでデリゲートは正確に何をしますか?

したがって、オブジェクトの処理を変更したりデータを提供したりする単一の提供オブジェクトであるため、デリゲートはオブジェクトとの関係がより緊密です。データを他のオブジェクトにロードするなど、意思決定や外部操作を延期しています。そのため、ジェネリックUIKitクラスの非常に一般的なパターンです。他のオブジェクトへの通知は、はるかに緩やかな関係です。つまり、何か起こったことを他の人に通知するだけです。

必然的に「対」の質問でもない。たとえば、バックグラウンド処理を行うアプリを持つと、何か変更された通知が発生し、ビューがそのビューを更新するためにデータソースデリゲートを呼び出すことができます。彼らは2つの異なるメカニズムです。

6
追加された

イベントとデリゲートには2つの目的がありますので、どちらも使用されています。

あなたのボタンを押してメッセージを鳴らしたいだけなら、イベントはいいです。フォーカスを失う前に完了ボタンを押してテキストフィールドのコンテキストを検証したい場合は、 textFieldShouldReturn デリゲートメソッドを使用して検証と戻りを処理できます検証しない場合は、いいえ。

代理人は実際にサブクラス化せずに動作を変更することができます。この目的のためにはすべきしたメソッドがあります。これらのメソッドは、アクションの前および/または後に検証、通知、または処理するときに、アクションメソッドをオーバーライドする代わりに実装します。

UIKitオブジェクトをサブクラス化する必要があると思われる場合は、まずその委譲メソッドを確認してください。すでにカスタムビヘイビアを配置する場所があります。

5
追加された

1つの明確な違いは、1対1の関係があるため、デリゲートメソッドは戻り値を持つことができることです。一方、イベントは送信クラスに緩やかに結合されます。送信クラスでは、応答するかどうかは気にしません。

他のデリゲートメソッドは、単に便宜上存在し、トリガーされる対応するイベントを持つことができます。

4
追加された