UITableView
を使用する際、reuseCell
を登録し、再利用することが多いと思います。
今回、xib
化したUITableViewCell
をreuseCell
として使う際にハマったのでTipsを共有します。
reuseCell
の登録をStoryboard
上で行うか、コード上でregisterNib
して行うかでポイントが変わってきます。
要は、どこでxib
をロードするかという話だと思っています。
Storyboard
でreuseCell
登録する場合
この場合は、カスタムセルクラス側でxib
をロードすることになります。
カスタムセル を xib 化する
カスタムViewをNibから初期化し、IBDesignableとIBInspectableで便利に使う の記事を参考にしてカスタムセルのxib
とソースを作成します。
ポイントとしては、
-
UITalbeViewCell
の場合は、ソースにinit(frame: CGRect)
が不要 - 記事にある通り、
xib
のFile's Owner
のclass
にカスタムセルクラス名を記述する - 同じく
xib
の設定で、カスタムセルのclass
とIdentifier
は空にしておく
xib 化したカスタムセルを使う
使う際の手順は、
-
Storyboard
上でUITableView
内のcell
のクラスとして上記で作成したカスタムセルを指定する -
Identifier
を設定する。この時、クラス名と同じIDは使えない
上記手順を行えば、あとは、UITableView#dequeueReusableCellWithIdentifier
でIDを指定して使うことができます。
コード上でreuseCell
登録する場合
この場合は使う側のソースコード(viewController
のviewDidLoad
など)でxib
をロードすることになります。
カスタムセルを xib 化する
xib
とソースの作成手順は、Storyboard
で登録する場合とほぼ同じです。
違いは、
-
xib
のFile's Owner
のclass
を空にする -
xib
のカスタムセルのclass
にカスタムセルクラス名を記述する。Identifier
を空にする - カスタムセルクラスのソースには
init?(coder aDecoder: NSCoder)
とcommonInit()
に記述した内容は不要なので削除する - 初期化などしたい場合は、
awakeFromNib
に記述すれば良い
xib 化したカスタムセルを使う
使う側のソースコード、例えばUITableViewController
のviewDidLoad
などに下記のコードを記述することで、xib
をreuseCell
として使うことができます。
// UITableViewControllerのviewDidLoadなど
let nib = UINib(nibName: "customCell", bundle: nil) // カスタムセルクラス名で`nib`を作成する
tableView.registerNib(nib, forCellReuseIdentifier: "customCellID") // `reuseCell`として登録する。クラス名と同じIDは使えない
最後に
xib
化するということは、Storyboard
も使っていると思いますので、前者のStoryboard
でreuseCell
登録する方がわかりがよいと思います。
Storyboard
で登録する場合と、registerNib
で登録する場合の違いがよくわからないまま進めてしまい、動くようになるまでけっこう時間がかかってしまいました。
この内容はUICollectionView
でも同じことが言えると思います。
スクショがなくてわかりにくい部分があると思いますが、同じことで悩んでいる人の助けになれば幸いです。