ichigoryume programming blog

プログラミングに関する備忘録。主にHTML5, C#, Swiftなど。

StoryboardでTableViewを使う

TableViewに表示するデータを用意するクラスを作る。

UITableViewDataSourceを継承したクラスにする。

サンプル

import UIKit

class MyDataSource: NSObject, UITableViewDataSource {
    
    func numberOfSections(in tableView: UITableView) -> Int {
        return 5 // 適当
    }
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return section * 2 //適当
    }

    func tableView(_ tableView: UITableView, titleForFooterInSection section: Int) -> String? {
        return String(format: "Section %d", section + 1)
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell")!
        cell.textLabel?.text = String(format: "row %d of section %d", indexPath.row, indexPath.section)
        
        return cell
    }
}

Storyboardで、MyDataSourceとTableViewを紐づける

ViewControllerにObjectを追加し、CustomClassでMyDataSourceを選択する
f:id:ichigoryume:20180105215338p:plain
f:id:ichigoryume:20180105215436p:plain

ViewControllerにTableViewを追加し、
TableView上からCtrlを押しながら、MyDataSourceへドラッグ
f:id:ichigoryume:20180105222217p:plain

ポップアップメニューでdataSourceを選択する
f:id:ichigoryume:20180105222331p:plain

TableViewにTableViewCellを追加し、プログラムコードから呼び出すためのidentifierをつける。
f:id:ichigoryume:20180106175927p:plain

実行結果

f:id:ichigoryume:20180105222429p:plain

考察:今回の例ではDataSourceクラスを用意して作ったが

TableViewController、TableViewDelegate、TableViewDataSourceは単一のクラスにまとめてしまった方が手っ取り早いかもしれない。
もちろん責務分割の観点から分離することは正しいとは思うが、

  • セルを選択された時の didSelectRowAt はDelegateでないと受け取れない
  • 画面遷移を起こす performSegue などは Controllerでないとコールできない -> DelegateはdidSelectRowAtを受け取っても画面遷移を起こせない
  • セルと紐づくデータの情報はDataSourceしかわからない。 -> Delegate および Controller はどう遷移させれば良いかわからない

このため、

class MyController : UITableViewController, UITableViewDelegate, UITableViewDataSource {
   ...
}

と書いてしまった方が遷移に関わる知識/コードを集約でき、シンプルに書けてしまうケースも多いと思う。