如何在Swift中使用UICollectionView修复'NSInternalInconsistencyExceptionException'错误?

时间:2019-09-25 20:10:35

标签: ios swift uicollectionview

我想在集合视图中显示我的数据。

我有一个fun whiteSpaceTrimmer(item) = item match { case is Array -> $ map whiteSpaceTrimmer($) case is Object -> $ mapObject { ($$): $ match { case is String -> trim($) case is Object -> whiteSpaceTrimmer($) case is Array -> $ map whiteSpaceTrimmer($) else -> $ } } case is String -> trim($) else -> $ } ,并且设置了UICollectionView委托方法。这是我在cellForItemAt委托方法中尝试过的代码。

cellForItemAt

编辑代码(所有cellForItemAt委托方法):

 let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "productCell", for: indexPath) as! ProductCollectionViewCell

这是错误消息:

  

“由于未捕获的异常'NSInternalInconsistencyException'而终止应用程序,原因:'从-collectionView:cellForItemAtIndexPath返回的单元格没有reuseIdentifier-必须通过调用-dequeueReusableCellWithReuseIdentifier:forIndexPath来检索单元格”'

1 个答案:

答案 0 :(得分:0)

您的问题是由所有这些guard/else语句引起的-如果任何guard失败,那么您将返回UICollectionViewCell()-就像异常所示,这是一个没有正确出队。

确实,您的数据模型应在此之前进行验证。 products应该包含Product的实例,而不是Dictionary的实例。这样,您永远不会将无效产品加载到数据源阵列中。

一旦你做完,你就可以简单地写

var products: [Product]

override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "productCell", for: indexPath) as! ProductCollectionViewCell

    let product = products[indexPath.item]
    cell.setProduct(product: product)

    return cell

}

请记住,随着集合视图的滚动,给定项目可能多次调用cellForItemAt:-它应该尽可能高效。尽管访问字典和创建Product并没有很大的开销,但也不需要一次又一次地进行操作。