はじめに
この前モブプロ?のようなことをやっていると UICollectionViewCell
の XIB に contentView
がない!なんでだ?ということがありました。
現象
どうやら Library(右上の+ボタン)から追加すると contentView
ありで生成され、クラスファイル作成時に Also create XIB file をチェックして追加すると contentView
なしで生成されるようです。

Interface Builder の上のセルが XIB チェックで作成したセル、下のセルが Library から追加したセルです。
確認
XIB 上で contentView
がないセルで実際に contentView
がないか確認してみました。
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "Cell", for: indexPath)
return cell
}
上のコードでブレークポイントを置いて以下を確認してみました。

どうやら contentView
はあるようです。
ラベルを置いて確認してみたところちゃんと UILabel
は contenView
上に追加されていました。


とりあえず XIB 上で contentView
がなくても問題はないようです。
いつから?
Xcode 13.1 と Xcode 11.0 でみてみましたがどちらも contentView
はありませんでした。
Do you use contentView in UICollectionViewCell if created from XIB?に Xcode の長年のバグだというコメントがありました。
いつからなんでしょう?
おわりに
とりあえず XIB 上で contentView
がなくても問題はないようですが気持ち悪いので Library から追加するようにしています。
結構前からみたいですがなんで今まで気づかなかったんだろう?(ずっと Library から追加してたのかな)