【问题标题】:CollectionView image does not update after ImagePicker picks an imageImagePicker 选择图像后,CollectionView 图像不更新
【发布时间】: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 方法,让我们了解问题所在

标签: ios swift xcode uicollectionview uiimagepickercontroller


【解决方案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 使用正确的图像
猜你喜欢
  • 2021-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-15
  • 2022-01-27
  • 1970-01-01
  • 2017-05-29
相关资源
最近更新 更多