Правильное время и место для перезагрузки UICollectionView после выбора изображения с помощью UIImagePicker - PullRequest
0 голосов
/ 16 апреля 2019

У меня возникли проблемы с пониманием того, где я должен перезагрузить данные в моем UICollectionView, чтобы изображения, выбранные с помощью UIImagePicker из галереи, отображались в представлении коллекции. Это код, который я сейчас использую, но я не могу понять, почему он дает сбой, выдавая ошибку 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. Я также убедился, что массив не пуст при отображении изображений. Есть идеи?

Ответы [ 2 ]

0 голосов
/ 17 апреля 2019

Решил это. Очевидно, проблема заключалась в том, что я использовал метод idenxPath.row для получения индекса, тогда как я должен был использовать indexPath.item для доступа к массиву изображений.

0 голосов
/ 16 апреля 2019

Установить источник данных для collectionViewImages. И перезагрузите collectionViewImages в picker обработчик завершения.

...