2016-12-16 12 views
0

View Controllerにテーブルビューを追加した後、TVからVCにInterface BuilderのVCにコントロールを2回ドラッグしてVCがデータソースであり、テーブルビュー。なぜデータソース/デリゲートを2回宣言する必要があるのですか?

View Controllerでは、クラス定義またはView Controller拡張で同じものを指定する必要があります。

これはなぜですか?これは冗長ではないですか?

ありがとうございました。

答えて

5

全くありません。あなたがしていることは、2つの異なることです。

UITableViewDatasourceUITableViewDelegateプロトコルに準拠しているため、このクラスはUITableViewのように使用できます」とコンパイラに伝えています。

UITableView「このクラスはここにあなたのdatasourcedelegateとして使用しますか?」と伝えています。

0

これはもちろん冗長ではありません。

名前の違いから分かるように、「代理人」と「データソース」は異なるものです。

データソースは、テーブルビューに表示されるデータに関する質問に回答します。たとえば、各セクションにはいくつの行がありますか?いくつのセクションがありますか?テーブルビューのセルはどれくらいの期間ですか?各セクションのヘッダービューとフッタービューは何ですか?

一方、代理人は、テーブルビューの動作に関する質問に回答します。例えば、ユーザがセルを選択したときに何をすべきか?ユーザーがセルの選択を解除したときに何をすべきか?ユーザーが編集を終了したらどうしたらいいですか?

データソースとデリゲートの機能が非常に異なるため、クラスはデータソースのみで、デリゲートではなく、その逆の場合もあります。 VCをデータソースとし、VCがデリゲートだと言うと、これを2回ドラッグするのはそのためです。

しかし、VCだけでなく、データソースとデリゲートも可能です。 VCがデータソースとデリゲートとして機能することをコンパイラに伝える必要があります。あなたが書いた理由です:

class MyVC: UITableViewDelegate, UITableViewDataSource {} 

あなたは、これが厄介2、できればUITableViewControllerを使用していると思われる場合。

関連する問題