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

Swift 4中如何持久化保存CollectionView中的选中图片

搞定选中图片保存到首个CollectionView的方案

我来帮你解决这个问题!核心就是做好数据传递、数据源更新和CollectionView刷新这几步,下面给你具体的实现方案(以Swift为例,OC的话思路完全一致):

1. 用闭包实现页面间的数据回传

首先在负责选图的第二个ViewController(我姑且叫它ImagePickerVC)里,定义一个闭包属性,用来把选中的图片回传给第一个页面:

class ImagePickerVC: UIViewController {
    // 定义闭包,用于回传选中的图片
    var onImageSelected: ((UIImage) -> Void)?
    
    // 这里放你原来的代码:CollectionView的数据源、Cell配置逻辑等
}

2. 点击“创建”时触发数据传递

当用户选好图片并点击「创建」按钮时,调用这个闭包把图片传回去,然后返回第一个页面:

@IBAction func createButtonTapped(_ sender: UIButton) {
    // 假设你已经拿到了用户选中的图片,比如叫selectedImage
    guard let selectedImage = selectedImage else { return }
    
    // 通过闭包把图片传给第一个VC
    onImageSelected?(selectedImage)
    // 返回首个页面
    navigationController?.popViewController(animated: true)
}

3. 在首个VC里接收图片并更新数据源

第一个ViewController(就叫MainVC吧)需要维护一个数组作为CollectionView的数据源,然后在跳转到选图页面时,设置闭包来接收图片:

class MainVC: UIViewController {
    // 图片数据源,初始是空数组
    var images: [UIImage] = []
    @IBOutlet weak var collectionView: UICollectionView!
    
    // 点击「添加」按钮的跳转逻辑
    @IBAction func addButtonTapped(_ sender: UIButton) {
        let imagePickerVC = storyboard?.instantiateViewController(withIdentifier: "ImagePickerVC") as! ImagePickerVC
        
        // 设置闭包,接收选好的图片
        imagePickerVC.onImageSelected = { [weak self] selectedImage in
            // 把选中的图片添加到数据源数组里
            self?.images.append(selectedImage)
            // 刷新CollectionView,让新图片显示出来
            self?.collectionView.reloadData()
        }
        
        navigationController?.pushViewController(imagePickerVC, animated: true)
    }
}

4. 配置首个VC的CollectionView数据源方法

别忘了给MainVC的CollectionView实现必要的数据源方法,这样图片才能正确显示:

extension MainVC: UICollectionViewDataSource {
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        // 返回数据源数组的长度
        return images.count
    }
    
    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "ImageCell", for: indexPath) as! ImageCell
        // 假设你的Cell里有个UIImageView叫imageView,把图片赋值给它
        cell.imageView.image = images[indexPath.item]
        return cell
    }
}

可选:持久化保存图片(重启App不丢失)

如果希望重启App后图片还能保留,你需要把图片保存到本地:

  • 用UserDefaults适合保存小尺寸图片:
// 保存图片时(在闭包里添加)
if let imageData = selectedImage.pngData() {
    // 可以存数组,这里先存单张示例,多张的话存Data数组
    var savedImagesData = UserDefaults.standard.array(forKey: "savedImages") as? [Data] ?? []
    savedImagesData.append(imageData)
    UserDefaults.standard.set(savedImagesData, forKey: "savedImages")
}

// App启动时读取(在MainVC的viewDidLoad里)
if let savedImagesData = UserDefaults.standard.array(forKey: "savedImages") as? [Data] {
    images = savedImagesData.compactMap { UIImage(data: $0) }
    collectionView.reloadData()
}
  • 如果是大图片,建议保存到Documents目录下,避免占用UserDefaults的存储空间。

内容的提问来源于stack exchange,提问作者nicholasdmoore

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:39:42