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
相关产品推荐
相关产品推荐

