🍎

UICollectionView.CellRegistration + xibのカスタムセル を利用したときの実行時エラーを回避する

2023/12/04に公開

UICollectionView.CellRegistration を利用し、xibファイルで作成したセルを登録した際に

というエラーが出ることがあったので、最小コードでの再現と回避方法を調査しました。

結論

UICollectionView.CellRegistration を使う場合、xibファイルの Collection Reusable View - Identifier は空にしましょう。

再現手順

最小コード

import UIKit

class ViewController: UIViewController, UICollectionViewDataSource {
    let collectionView = UICollectionView(frame: .null, collectionViewLayout: UICollectionViewFlowLayout())
    let cellRegistration = UICollectionView.CellRegistration<CollectionViewCell, String>(
        cellNib: .init(nibName: "xibファイル名", bundle: nil)
    ) { _, _, _ in }

    override func viewDidLoad() {
        super.viewDidLoad()

        view.addSubview(collectionView)
        collectionView.translatesAutoresizingMaskIntoConstraints = false
        collectionView.leadingAnchor.constraint(equalTo: view.leadingAnchor).isActive = true
        collectionView.trailingAnchor.constraint(equalTo: view.trailingAnchor).isActive = true
        collectionView.topAnchor.constraint(equalTo: view.topAnchor).isActive = true
        collectionView.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true
        collectionView.dataSource = self
    }

    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        1
    }

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        collectionView.dequeueConfiguredReusableCell(using: cellRegistration, for: indexPath, item: "")
    }
}

コードだけを見ると問題はなさそうに見えますが、xibファイル側に原因がありました。

UICollectionView.CellRegistration の登場前に利用していた Collection Reusable View - Identifier に値が設定されています。
これを空にすることで、実行時エラーが出なくなりました。

考察

UICollectionView.CellRegistration(cellNib:handler:) のドキュメントにはxibファイルのIdentifierについて言及がありません。
エラーメッセージの内容から、登録処理の内部で独自のIdentifierが設定され、それがxibファイルのIdentifierと一致しないためエラーになっているのだと考えられます。

Discussion