Swift中UICollectionView双分区展示新增图片误显示在第0分区如何解决
问题原因
- 未实现
UICollectionView的numberOfSections数据源方法,系统默认分区数为1,不存在第1分区,所有内容只会在第0分区渲染。 - 上传图片成功后,你将返回的图片数据追加到了第0分区的数据源
oldArray中,自然会在第0分区展示新增内容。 - 现有代码存在多处逻辑疏漏:
numberOfItemsInSection没有补全isEdit = false分支的返回值,isEdit、上传成功判断用的message变量未在代码中声明,会触发编译错误。
解决方法
按以下步骤修改代码即可实现需求:
- 第一步:实现分区数数据源方法,编辑状态下返回2个分区
- 第二步:上传成功后不要把新增数据追加到
oldArray,如果需要在第1分区持久化展示上传后的图片,可新增对应数组存储,或直接保留newArray的内容即可 - 第三步:补全所有缺失的逻辑分支,避免编译报错
修正后的核心代码
import UIKit class BidPlaceVC: UIViewController, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout { // 标记编辑状态,可根据你的实际业务逻辑赋值 var isEdit: Bool = true var oldArray = [ImagesModel]() var newArray = [UIImage]() @IBOutlet weak var filesCollectionView: UICollectionView! override func viewDidLoad() { super.viewDidLoad() // 必须设置collectionView的数据源和代理 filesCollectionView.dataSource = self filesCollectionView.delegate = self let layout = UICollectionViewFlowLayout() layout.scrollDirection = .horizontal let width = UIScreen.main.bounds.width/4.1 layout.itemSize = CGSize(width: width, height: 100) self.filesCollectionView.collectionViewLayout = layout filesCollectionView.reloadData() } // MARK: - UICollectionView 数据源 // 新增:返回分区数 func numberOfSections(in collectionView: UICollectionView) -> Int { return isEdit ? 2 : 1 } func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { if isEdit { return section == 0 ? oldArray.count : newArray.count } // 补全非编辑状态的返回逻辑,可按需调整 return oldArray.count } func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "FilesCollectionCell", for: indexPath) as? FilesCollectionCell else { return UICollectionViewCell() } if indexPath.section == 0 { let img = oldArray[indexPath.item].image cell.imgView.getImage(withUrl: img, placeHolder: #imageLiteral(resourceName: "home"), imgContentMode: .scaleAspectFill) } else { cell.imgView.image = newArray[indexPath.item] } return cell } func uploadServiceCall() { var imgData = [Data]() for image in self.newArray { if let data = image.jpegData(compressionQuality: 0.5) { imgData.append(data) } } APIReqeustManager.sharedInstance.uploadMultipleImagesWithParam(url: CommonUrl.place_bid, imagesData: imgData, imageKey: "files", parameters: param, completionHandler: {(responseData) in if let result = responseData.dict?["result"] as? [String: Any], let message = result["message"] as? String, message == "Success" { // 这里不要追加到oldArray,如果需要清空新增图片可以清空newArray,不需要的话保留即可 // self.oldArray.append(ImagesModel(image: filesArray, id: 0)) DispatchQueue.main.async { self.filesCollectionView.reloadData() } } }) } }
运行效果

内容的提问来源于stack exchange,提问作者anySwift
相关产品推荐
相关产品推荐

