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でも同じことが言えると思います。
スクショがなくてわかりにくい部分があると思いますが、同じことで悩んでいる人の助けになれば幸いです。