我正在使用XIB制作一个自定义collectionview单元。
collectionview作为扩展放置在viewController内部。
这是我用来调用Xib View的代码,但是我收到一条错误消息,告诉我需要使用复用标识符。但是我不知道在使用XIB时如何使用它。
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = Bundle.main.loadNibNamed("CustomCell", owner: self, options: nil)?.first as! CustomCell
return cell
}
由于未捕获的异常“ NSInternalInconsistencyException”而终止应用程序,原因:“从-collectionView:cellForItemAtIndexPath返回的单元格没有reuseIdentifier-必须通过调用-dequeueReusableCellWithReuseIdentifier:forIndexPath:来检索单元格” ***首先抛出调用堆栈:
答案 0 :(得分:2)
首先,您需要为您的单元创建一个reuseIdentifier。让我们根据您的collectionViewCell类名称创建它。在您的ViewController文件中声明复用ID:
let reuseId = String(describing: CustomCell.self)
您需要在viewDidLoad方法中将单元格注册到您的collectionView中。
collectionView.register(CustomCell.self, forCellReuseIdentifier: reuseId)
然后在您的cellForItemAt
方法中:
guard let cell = collectionView.dequeueReusableCell(withIdentifier: reuseId, for: indexPath) as? CustomCell else { return UICollectionViewCell() }
//return cell, or update cell elements first.
答案 1 :(得分:1)
您可以像这样注册CustomCell
let customCellNib = UINib(nibName: "CustomCell", bundle: .main)
collectionView.register(customCellNib, forCellWithReuseIdentifier: "CustomCell")
并在cellForItemAt
中使用相同的已注册单元格,
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier:"CustomCell", for: indexPath) as? CustomCell else {
return UICollectionViewCell()
}
return cell
}
答案 2 :(得分:1)
对于Swift 4.0和4.2
在您的 viewDidLoad 中:
自定义collectionViewCell
mainCollectionView.register(UINib(nibName: "your_custom_cell_name", bundle: nil), forCellWithReuseIdentifier: "your_custom_cell_identifier")
在cellForItemAt的indexPath中:
let cell : <your_custom_cell_name> = mainCollectionView.dequeueReusableCell(withReuseIdentifier: "your_custom_cell_identifier", for: indexPath) as! <your_custom_cell_name>
别忘了在xib部分为您的自定义单元格设置标识符。