UICollectionView复用Cell时所有单元格显示相同图片问题求助
问题分析与修复方案
问题根源
你在cellForItemAt方法里遍历了整个imgarr数组,每个单元格会被数组中所有媒体资源依次设置图片,最终最后一个资源的图片会覆盖之前的所有设置,导致所有单元格都显示最后一个媒体资源的内容。
修复代码
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { // 安全获取复用单元格,避免类型转换失败崩溃 guard let cell = imageCollectionView.dequeueReusableCell(withReuseIdentifier: "photoCell", for: indexPath) as? photoCell else { return UICollectionViewCell() } // 清空旧内容,解决单元格复用导致的残留问题 cell.cellImageVIew.image = nil // 直接获取当前单元格对应的媒体URL,无需遍历整个数组 let mediaURL = imgarr[indexPath.row] do { let resourceValues = try mediaURL.resourceValues(forKeys: [.typeIdentifierKey]) guard let typeID = resourceValues.typeIdentifier, let utType = UTType(typeID) else { print("无法识别媒体类型") return cell } if utType.supertypes.contains(.image) { cell.cellImageVIew.image = UIImage(contentsOfFile: mediaURL.path()) } else if utType.supertypes.contains(.movie) { cell.cellImageVIew.image = getThumbnailFrom(path: mediaURL) } else { print("非图片/视频类型资源") } } catch { print("获取媒体类型失败:\(error.localizedDescription)") } return cell }
关键优化点
- 移除遍历
imgarr的循环,直接通过indexPath.row获取当前单元格对应的媒体资源,每个单元格只处理自己的目标内容。 - 用
guard做可选值安全校验,替代原代码中的强制解包(typeID!、supertypes!),避免触发崩溃。 - 设置图片前先清空
imageView,解决UICollectionView单元格复用带来的旧内容残留问题。
内容的提问来源于stack exchange,提问作者Ark Ark
相关产品推荐
相关产品推荐

