🍎
UICollectionView.CellRegistration + xibのカスタムセル を利用したときの実行時エラーを回避する
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