UITableViewController のセルをカスタマイズする方法

ここでは、前回作成したテーブルビューサンプルプログラムを少し変更して、テーブルのセルをカスタマイズします。

ここではセルのフォントを変えるのと、背景を薄黄色にしています。

テーブルのセルをカスタマイズするには、テーブルセルを表す UITableViewCell クラスの派生クラスを作ります。

UITableViewCell のままでも、表示タイプが数種類用意されています。そのため、画像を左側に表示する、左右に文字をひとつずつ表示するなどなら、サブクラスを作る必要はありません。 ここでは汎用的に利用できる方法を紹介しています。

新規の Cocoa Touch クラスファイルを作成します。

Cocoa Touch というのは iOS 用アプリケーション用のフレームワークです。

UITableViewCell のサブクラスを作ります。名前はデータモデルクラスを Person という名前にしていたので、PersonTableViewCell という名前にしておきます。

このとき、Also create XIB file (XIB ファイルも作る) というオプションにチェックをつけておきます。

XIB ファイルというのは、GUI インターフェイスビルダーでビューを定義するためのファイルです。

XIB をビルドして NIB (NeXT Interface Builder) ファイルを作成します。XIB は XML ファイルで、NIB はバイナリファイルです。 XIB ファイルも単に NIB と呼ばれたりします。

さて、ファイルを作ったあと XIB ファイルをみてみると、作成した UITableViewCell クラスのサブクラスが、 XIB ファイルのビュークラスに設定されていることがわかります。

ここでは、単に背景色を薄黄色に設定して、UILabel をひとつ配置します。(変化がわかるように、フォントを適当に変えました)

アシスタントエディタを開き、PersonTableViewCell.swift が開いているのを確認したら、ラベルをアシスタントエディタに ⌃ control ドラッグすることで、アウトレットを作成します。

PersonTableViewCell.swift にアウトレットが作成されますが、このファイルの変更はこれだけで、あとは自動的にテンプレートが作成したままです。

import UIKit

class PersonTableViewCell: UITableViewCell {

    @IBOutlet weak var nameLabel: UILabel!

    override func awakeFromNib() {
        super.awakeFromNib()
    }

    override func setSelected(_ selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)
    }

}

さて、テーブルビューコントローラの方での変更は次の通りです。

  • カスタムのテーブルビューセルクラスの登録
  • dequeueReusableCell でカスタムテーブルビューセルオブジェクトを受け取ったら値をセット

ViewController.swiftの全体は次の通りです。

import UIKit

class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {

    let cellIdentifier = "PersonTableViewCell"
    ...
    override func viewDidLoad() {
        super.viewDidLoad()

        tableView.register(UINib(nibName: "PersonTableViewCell", bundle: nil), forCellReuseIdentifier: cellIdentifier)
        tableView.delegate = self
        tableView.dataSource = self
    }

    func tableView(
        _ tableView: UITableView,
        cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        let cell = tableView.dequeueReusableCell(
            withIdentifier: cellIdentifier,
            for: indexPath) as! PersonTableViewCell
        let p = PersonStore.shared.get(index: indexPath.row)
        cell.nameLabel.text = p.name
        return cell
    }
    ...

UITableView クラスの register メソッドに、カスタムのテーブルビューセルクラスの NIB を渡して登録します。

すると、tableView(_:cellForRowAt:) メソッド内で、dequeueReusableCell メソッドを呼び出した時に、PersonTableViewCell オブジェクトが受け取れます。

ダウンキャストになりますが、ここでは型は決まっているので as! で問題なく PersonTableViewCell オブジェクトが受け取れます。

これでセルに値をセットすることができます。

以上で、UITableView でカスタムの UITableViewCell クラスを使う方法を紹介しました。

ここまでお読みいただき、誠にありがとうございます。SNS 等でこの記事をシェアしていただけますと、大変励みになります。どうぞよろしくお願いします。

© 2024 Swift による iOS 開発入門