You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift中UICollectionView双分区展示新增图片误显示在第0分区如何解决

问题原因
  1. 未实现UICollectionView的numberOfSections数据源方法,系统默认分区数为1,不存在第1分区,所有内容只会在第0分区渲染。
  2. 上传图片成功后,你将返回的图片数据追加到了第0分区的数据源oldArray中,自然会在第0分区展示新增内容。
  3. 现有代码存在多处逻辑疏漏: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 20:09:02