使用 UIImagePicker 拾取图像后重新加载 UICollectionView 的正确时间和位置

Posted

技术标签:

【中文标题】使用 UIImagePicker 拾取图像后重新加载 UICollectionView 的正确时间和位置【英文标题】:Correct timing and place for reloading UICollectionView after picking image with UIImagePicker 【发布时间】:2019-04-16 12:31:13 【问题描述】:

我很难理解应该在 UICollectionView 中的何处重新加载数据,以便通过 UIImagePicker 从图库中选择的图像显示在 Collection View 上。这是我现在正在使用的代码,但我似乎无法理解为什么它崩溃给我一个 SIGBRT 错误,就在选择器被解雇之后。我通过情节提要设置代表。

@IBOutlet weak var addImage: UIButton!
var imagesArray : [UIImage] = []
@IBAction func buttonPickerPressed(_ sender: UIButton) 
    if imagesArray.count < 5 
    picker.delegate = self
    picker.sourceType = .photoLibrary

    present(picker, animated: true, completion: nil)
    
    else 
    addImage.isHidden = true 

@IBOutlet weak var collectionViewImages: UICollectionView!
let picker = UIImagePickerController()



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


func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell 
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "", for: indexPath) as! CollectionViewCell
    cell.imageDisplayed.image = imagesArray[indexPath.row]
    return cell



func imagePickerController(_ picker: UIImagePickerController,
                           didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any])
    collectionViewImages.delegate = self
    if imagesArray.count < 5 
        guard let selectedImage = info[.originalImage] as? UIImage else 
            fatalError("Expected a dictionary containing an image, but was provided the following: \(info)")
        
        imagesArray.append(selectedImage) //whatever space is free] = selectedImage
        picker.dismiss(animated: true, completion: nil)
        self.collectionViewImages.reloadData()
    
    else 
        let alert = UIAlertController(title: "Error", message: "Maximum amount of images reached", preferredStyle: .alert)
        let action = UIAlertAction(title: "Dismiss", style: .default)  (action) in
        return
        alert.addAction(action)
        picker.dismiss(animated:true ,completion:nil)
        present(alert, animated: true, completion: nil)


--------- 更新 ---------- 我还在主 VC 中创建了一个按钮,带有一个操作,以便在按下时触发 collectionView 重新加载,但仍然没有运气。无论我什么时候按下重新加载,当我这样做时,应用程序都会因 NSException 错误而崩溃。我确保在显示图像时数组不为空。有什么想法吗?

【问题讨论】:

DispatchQueue.main.async self. collectionViewImages.reloadData() 将你的 this (self.collectionViewImages.reloadData()) 行改成以上... 让我知道它是否有效...... 发帖前已经试过了,还是不行。 【参考方案1】:

collectionViewImages设置数据源。并在 picker 完成处理程序中重新加载 collectionViewImages

【讨论】:

我通过storyboard设置了delegate和dataSource,我试过补全了,还是不行【参考方案2】:

解决了。显然问题是我使用 idenxPath.row 方法来获取索引,而我应该使用 indexPath.item 来访问图像数组。

【讨论】:

以上是关于使用 UIImagePicker 拾取图像后重新加载 UICollectionView 的正确时间和位置的主要内容,如果未能解决你的问题,请参考以下文章

从uiimagepicker捕获图像后如何自定义图像

swift 使用UIIMagePicker轻松选择图像

在不使用 uiimagepicker 控制器的情况下捕获图像和视频

在 iOS 中存储 UIImagePicker 选取的图像

UIImagePicker 无法在 iOS 3.1.3 上执行全屏转换

在 iOS8 上使用 UIImagePicker 结果 URL 和 PHAsset 从“我的照片流”加载图像