UICollectionViewCellはUICollectionViewで使う。UICollectionViewCellに相当するものを直接UICollectionViewに書いてはいけない。これはUITableViewと同様である。
ここではUIViewControllerでUICollectionViewを表示し、UICollectionViewがさらにUICollectionViewCellを呼び出している状況を考える。
UICollectionViewが表示されない
最初にdelegateあたりを疑う。ただ、多くの開発者は反射的にdataSourceとdelegateはやっていると思う。
考えられる原因:
- そもそもUIViewControllerのフィールドでUICollectionViewを宣言していない
- 初期化していない(collectionView.frame=...をしていない)
- self.view.addSubviewでUIViewControllerのviewに追加していない
- dataSourceとdelegateをしていない
- registerしていない(昔の書き方と変わっていることに注意)
- reloadDataしていない
- numberOfItemsInSectionとcellForItemAtをきちんと設定していない
- sizeForItemAtをきちんと設定していない(こちらはセルだけが表示されない場合によくある)
- withReuseIdentifierを一致させていない
- そもそもクラスの継承がうまくいっていない
意外によくあるのが継承の失敗。UIViewControllerでUICollectionViewを使うときは、次のクラスを継承する。
UIViewController
UICollectionViewDataSource
UICollectionViewDelegate
UICollectionViewDelegateFlowLayout
numberOfItemsInSection、cellForItemAt、sizeForItemAtあたりは、returnする前にprint(indexPath)などと書いて確かめるようにする。後述するように、サイズ設定を間違えたときのエラーチェックはだいぶ軽減される。
numberOfItemsInSection、cellForItemAt、sizeForItemAtは必ずprintで正常に動いているかチェックする。
UICollectionViewCellが表示されない
おおもとのUICollectionViewは表示されるが、UICollectionViewCellは表示されないという場合は、次の原因が考えられる。
- セル内部でoverride initをきちんと設定していない
- withReuseIdentifierが一致していない
- セルのサイズが大きすぎる
- UICollectionViewのdataSourceあたりがうまくいっていない
- UICollectionViewのsizeForItemAtあたりがうまくいっていない
最もポピュラーなものがoverride initをきちんと書いていないこと。
withReuseIdentifierはUIViewControllerのフィールドで宣言したほうがいい。直にcellなどと書いてはいけない。
セルのサイズをきちんと設定しないとそもそも表示されない可能性がある。セルは背景の色をわかりやすく変えて、きちんと表示されているか確かめるべきだ。表示されているのに、自分だけが表示されていないと誤解している可能性もある。
結局のところ、セルのサイズは呼び出し側であるUICollectionViewで決めたほうがいい。これはもちろんsizeForItemAtで設定するが、一部の記事はここで誤った設定を紹介している。初めてこれを使う人は注意しよう。
let width: CGFloat = UIScreen.main.bounds.width
は良くない書き方だ。
let width: CGFloat = collectionView.frame.width
といったようにcollectionViewの幅をベースにしたほうがいい。