2011-11-24 8 views
5

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

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

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

答えて

6

EDIT:もう一つの良いポスト:1があるので NSNotificationCenter vs delegation(using protocols)?

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

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

参加者は、そのようなコールバックの前後などの処理をいくつかの他のオブジェクトのパイプラインにコードを差し挟むことができることコントロールのデータソースを提供し、ビュー間通信に適しています:

What exactly does delegate do in xcode ios project?

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

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

4

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

他のデリゲートメソッドは、便宜上のものであり、トリガーされる対応するイベントを持つこともできます。 1の関係:

5

イベントとデリゲートには2つの目的があるため、両方が使用されています。

ボタンを押すだけでメッセージを発信したい場合は、イベントは正常です。 ボタンを押してフォーカスを失う前にテキストフィールドのコンテキストを検証する場合は、textFieldShouldReturnデリゲートメソッドを使用して検証を処理し、検証しない場合はNOを返します。

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

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

関連する問題