如何使用XIB将自定义collectionviewCell连接到复用标识符-Swift

时间:2018-12-22 12:12:12

标签: ios swift xib collectionview reuseidentifier

我正在使用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:来检索单元格”   ***首先抛出调用堆栈:

3 个答案:

答案 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部分为您的自定义单元格设置标识符。