質問: tableViewを用いたアプリを作っており、apple developerの公式ドキュメントの他に、 下記のサイトを参考にしております。 「SwiftでTableViewを使ってみよう」 https://qiita.com/pe-ta/items/cafa8e20029047993025 この中の「TableViewのOutletsを設定」のところで ViewControllerと、OutletsのdataSourceとdelegateを繋いでおります。 1これをしなければ、コードがtableViewに反映されないということは分かるのですが、 どのような意味があるのでしょうか。 2コードで表すとしたらどのように表せばいいでしょうか。 また、「TableViewCellのIdentifierを設定」のところで、こちらもまたコードとtableViewCellを繋ぐ行為だということは分かるのですが、3`register(_:forCellReuseIdentifier:)`を使用する場合、どのようなコードを書けばよろしいでしょうか。 第一引数でクラスを求められるので、1からセルに対応するクラスを作ることになるのでしょうか。 後学のためにもコードで表す方法を知っておきたいですし、 アプリ制作で、あとから振り返りやすくするため、 なるべくXcodeのUtility areaは使わず、コードでまとめたいと考えております。 何卒、よろしくお願いします。
回答: > > 1これをしなければ、コードがtableViewに反映されないということは分かるのですが、 > > どのような意味があるのでしょうか。 > > > delegate, dataSource を設定しなければ、tableView の枠を表示したあとの表示するべきセルの個数の計算、個別のセルの表示やセルを選択したときの動作などを設定することができませんし、仮にコードで設定してもそれを反映させることもできません。 ちなみに、teratail で「UITableView, UICollectionView (のセルの中身)が表示されない」という質問の多くは、これら delegate や dataSource の設定漏れです。 > > 2コードで表すとしたらどのように表せばいいでしょうか。 > > > 過去のご質問 * [https://teratail.com/questions/242391](TableViewのcellForRowAtでエラーが出ます。 を拝見しました。 そこで提示されているコードで設定している通りとなります。 具体的に指摘すれば、tableView へのアウトレットを ``` @IBOutlet var tableView: UITableView! ``` と設定したのであれば、`viewDidLoad()`などで ``` tableView.delegate = self tableView.dataSource = self ``` と記述する方法が多いかと思います。 ただし、`self`の部分は delegate や dataSource をどのクラスで設定するのかによって、違うインスタンスを設定する場合もあります。 > > また、「TableViewCellのIdentifierを設定」のところで、こちらもまたコードとtableViewCellを繋ぐ行為だということは分かるのですが、3register(_:forCellReuseIdentifier:)を使用する場合、どのようなコードを書けばよろしいでしょうか。 > > 第一引数でクラスを求められるので、1からセルに対応するクラスを作ることになるのでしょうか。 > > > これも過去のご質問 * [https://teratail.com/questions/242391](TableViewのcellForRowAtでエラーが出ます。 で提示されているコードの中でご自身が設定されています。 そこでは ``` tableView.register(UINib(nibName: "ShopCell1", bundle: nil), forCellReuseIdentifier: "ShopCell1") ``` という具合に設定されていますので、このような記述となります。 ちなみに、上記の場合は xib でカスタムセルを設定する方法となります。 もし、Table View Cell を使ってカスタムセルを記述するのであれば、上記の設定は不要で、StoryBoardでカスタムセルと Reuse Identifier を設定すれば ``` let cell = tableView.dequeueReusableCell(withIdentifier: "reuseIdentifier", for: indexPath) ``` のような感じでセル生成時に(具体的には`tableView(_:cellForRowAt:)`で)設定することとなります。