MILLEN BOX 2

個人iOSアプリ開発者hollymotoによる勉強の記録。時々雑記。

XIBでUITableViewCellをカスタムして利用する方法

こんにちは。hollymoto@anthrgrnwrld です。
TableViewで表示しているセルをカスタマイズしたく無いですか??そうですよね?したいに決まってます。
そこで今回はXIBで作成したカスタムUITableViewCellを利用する方法を残しておきます。
え?Storyboardだけでもカスタム出来るって??いや、その通りなんですが、XIBで作った方が何かと流用出来たりするので便利かなーっと思いまして。
今回のカスタムはBackgroud Colorを変更するだけです。

f:id:anthrgrnwrld:20200601222753p:plain:w400

「それだけ?」と思うことなかれ。凝ったカスタムも全てこれの応用です。基本大事。

では行きます。

目次

0. 前提

TableViewを表示する簡単なアプリを作って置いて下さい。
この記事ではここで紹介したListViewControllerを元にして変更していますが、本当に何でも構いません。

1. 手順1 XIBファイルとswiftファイルの追加

XcodeのFile→New→File...選択し、Cocoa Touchクラスを新規追加します。Subclassは勿論UITableViewCell。「Also create XIB file」にチェックを入れて下さい。チェックを入れておくとswiftファイルとXIBファイルが同時に生成されます。チェックを入れてなくても後で追加出来ますが、その場合少しだけ追加で記載必要な箇所が出てきますので、今回は同時生成の方法で進めますね。
f:id:anthrgrnwrld:20200601124354p:plain:w500
UITableViewCellを継承したクラスをListViewCellとしました。

2. 手順2 XIBのセルのIdentifierを入力

作成したXIBのListViewCellのセルのIdentifierを入力してあげる必要があります。通常のTableViewの時もどのセルを呼び出すか指定しますよね(この記事の2-5. Delegateメソッドの実装 - その3 tableView:cellForRowAt:を参照)。 f:id:anthrgrnwrld:20200601223222p:plain:w600
指定するIdentifierはCustomCellとしました。

3. 手順3 XIBでセルをカスタマイズ

ここでXIBを自由にカスタマイズします。
ListViewCellはUITableViewCellを継承していますが、デフォルトでは以下のような構成になっています。
f:id:anthrgrnwrld:20200602071846p:plain:w600

  • ListViewCell (UITableViewCell)

    • Content View (UIView)

今回はListViewCellをオレンジ色にカスタムしました。
f:id:anthrgrnwrld:20200602072321p:plain:w600

今回は簡単なセル色の変更をしたのみですが、Viewを足したりLabelを足したり、それらをswiftファイルと紐付けしてコード(今回の場合だとListViewCell.swift)と連携することも勿論可能です。この辺りはStoryboardを用いた時と感覚は変わりません。また色々試してみましょう。

4. 手順4 UITableViewCellのXIBをTableViewで使用するセルとして登録する

TableViewと紐付けされているSwiftファイル(恐らくUIViewControllerやUITableViewControllerのはず)のviewDidLoadで、XIBをTableViewで使用するセルとして登録してあげる必要があります。
コードは以下です。コード中のtableViewという箇所は状況により異なる(SotryboardのTableViewをコードと紐付けて新たな名前にしてるケースなどがある)為、適切なものに置き換えお願いします。

tableView.register(UINib(nibName: "ListViewCell", bundle: nil), forCellReuseIdentifier: "CustomCell")

ここで注意しなければいけないのは、一つ目の引数はXIBのファイル名であること。Web上がっている例などはXIBファイル名のカスタムセルのIdentifierを共通にしている場合が多く、たまたま同じ文字列が入っているケースが多く混乱しますが、同じ文字列でも意味合いが異なりますので注意が必要です。
詳しくはリファレンスを見てね。

https://developer.apple.com/documentation/uikit/uiviewcontroller/1621359-init

そしてTableViewを動かしているならば実装済みだと思われるtableView:numberOfRowsInSection:内で設定しているセルの指定をCustomCellに変更します。

//各セルの要素を設定する
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    (省略)
    let cell = tableView.dequeueReusableCell(withIdentifier: "CustomCell", for: indexPath)
    (省略)
    return cell
}
  1. まとめ 手順4のところ、XIBをTableViewの使用するセルとして登録する箇所でリファレンスを読まずにWebの情報を何となく使って実装すると上手くいかず「そんなに難しいことでは無いはずなのに」と混乱しました。その後日を改めて冷静にリファレンスを見て根本的にメソッドの意味合いを理解していなかったことに気づいた次第です。やっぱりリファレンスを読むのって大事です。