gpt4 book ai didi

ios - 如何在 Swift 中使用 UICollectionView 修复 'NSInternalInconsistencyException' 错误?

转载 作者:行者123 更新时间:2023-11-29 05:26:36 25 4
gpt4 key购买 nike

我想在 Collection View 中显示我的数据。

我有一个 UICollectionView 并设置了 cellForItemAt 委托(delegate)方法。这是我在 cellForItemAt 委托(delegate)方法中尝试过的代码。

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

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

    override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "productCell", for: indexPath) as! ProductCollectionViewCell

let productSnapshot = products[indexPath.item]

if let productsDictionary = productSnapshot.value as? NSDictionary{
guard let productName = productsDictionary["name"] as? String else { return UICollectionViewCell() }
guard let productPrice = productsDictionary["price"] as? Int else { return UICollectionViewCell() }
guard let productCategory = productsDictionary["category"] as? String else { return UICollectionViewCell() }

let product = Product(uid: productSnapshot.key, name: productName, price: productPrice, categoryUid: productCategory)

cell.setProduct(product: product)
}

return cell

}

这是错误消息:

"Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'the cell returned from -collectionView:cellForItemAtIndexPath: does not have a reuseIdentifier - cells must be retrieved by calling -dequeueReusableCellWithReuseIdentifier:forIndexPath:'"

最佳答案

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

确实,您的数据模型应该在达到这一点之前就已经得到验证。 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

}

请记住,当 Collection View 滚动时,cellForItemAt: 可能会针对给定项目多次调用 - 它应该尽可能高效。尽管访问字典和创建 Product 的开销并不大,但无需一次又一次地执行此操作。

关于ios - 如何在 Swift 中使用 UICollectionView 修复 'NSInternalInconsistencyException' 错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58105924/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com