我想在集合视图中显示我的数据。
我有一个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来检索单元格”'
答案 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
并没有很大的开销,但也不需要一次又一次地进行操作。