ImagePicker 选择图像后,CollectionView 图像不更新

Posted

技术标签:

【中文标题】ImagePicker 选择图像后,CollectionView 图像不更新【英文标题】:CollectionView image does not update after ImagePicker picks an image 【发布时间】:2017-05-27 08:07:20 【问题描述】:

我有一个 collectionView 单元格,里面有一张图片。当用户点击图像时,会弹出图像选择器。但是,选择图像时,CollectionView中的图像不会更新。我在常规 UIViewController 中使用了完全相同的代码并且它有效,所以我假设它是因为这是在 UICollectionViewController 中。

这是应该更新图像的代码:

func updateCollectionView(image: UIImage) 
    let indexPath = IndexPath(item: 3, section: 0)
    if let LoginCell = collectionView.cellForItem(at: indexPath) as? LoginCell 
        LoginCell.logoImageView.image = image
    
    collectionView.reloadItems(at: [indexPath])

这里是委托函数:

weak var delegate: LoginControllerDelegate?

func updateCollectionView(image: UIImage) 
    delegate?.updateCollectionView(image: image)

这里是将委托和 updateCollectionView 函数联系在一起的选择器函数:

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any])  
    print(info)
    picker.delegate = self
    var selectedImageFromPicker: UIImage?

    if let editedImage = info["UIImagePickerControllerEditedImage"] 

        selectedImageFromPicker = editedImage as? UIImage

     else if let originalImage = info["UIImagePickerControllerOriginalImage"] 
        selectedImageFromPicker = originalImage as? UIImage
    

    if let selectedImage = selectedImageFromPicker 
        updateCollectionView(image: selectedImageFromPicker!)
    

这里是 collectionView 方法,LoginCell 是我试图调出选择器的地方:

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int
    return pages.count + 1


func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell 
    if indexPath.item == pages.count
        let loginCell = collectionView.dequeueReusableCell(withReuseIdentifier: loginCellId, for: indexPath) as! LoginCell
        loginCell.delegate = self
        return loginCell
    

    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: cellId, for: indexPath) as! PageCell

    let page = pages[indexPath.item]
    cell.page = page

    return cell

这是我在协议中创建的委托方法:

protocol LoginControllerDelegate: class func updateCollectionView(image: UIImage)

【问题讨论】:

你是在挑选图片后重新加载数据吗? 我试过了,没用 如何更新单元格中的imageView?你在这里所做的就是更新logoImageView 更新imageView 是什么意思?我更新了 UICollectionView,但没有做任何事情,所以我删除了它。您如何专门更新imageView @chillin' 你能否展示一下 collectionView 方法,让我们了解问题所在 【参考方案1】:

将此代码添加到方法的末尾。

if let selectedImage = selectedImageFromPicker, let yourCell = collectionView.cellForItem(at: IndexPath(item: 3, section: 0)) as? CustomCell 
    yourCell.logoImageView.image = selectedImage
    collectionView.reloadItems(at: [IndexPath(item: 3, section: 0)])

这将获取您的单元格的引用,更新其logoImageView 并重新加载项目。

【讨论】:

我应该用什么替换 yourIndexPath? indexPath 要更新的单元格。你在用collectionView(_:didSelectItemAt:)吗? 不,我没有使用它。我可以改用collectionView.reloadData() 吗? 是的,您可以这样做,但您需要更新您的数据模型,以便 cellForItem 使用正确的图像 让我们continue this discussion in chat.

以上是关于ImagePicker 选择图像后,CollectionView 图像不更新的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ImagePicker 控制器的单元格类中设置图像

Flutter Resize ImagePicker Image 在上传到firebase之前

无法使用模拟器从 iOS 中的 ImagePicker 获取图像路径和图像?

如何使用 Swift/SwiftUI 从 ImagePicker 获取选定的图像文件名

如何正确地将 ImagePicker 插入标题中的图像? SwiftUI

SwiftUI ImagePicker 保存(图像-> UIImage--> 数据)到核心数据