Я продолжаю получать сообщение об ошибке при добавлении новой ячейки в представление коллекции

Я пытаюсь добавить данные из одного контроллера представления в контроллер представления коллекции, который добавляет элемент в массив источника данных, а затем добавляет ячейку в представление коллекции.

prepareforsegue в предыдущем ViewController

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "unwindToCollectionView"{
        let CVC = segue.destination as! CollectionViewController
        if let image = image{
        CVC.images.insert(imagePost(image:image), at: 0)
            print("Image is not nil")
        }
        let index = IndexPath(item: 0, section: 0)
        //CVC.collectionView?.reloadData()

        CVC.collectionView?.collectionViewLayout.invalidateLayout()
        CVC.collectionView?.layoutIfNeeded()
        CVC.collectionView?.insertItems(at: [index])
        //CVC.collectionView?.reloadItems(at: [index])
        print("In prepare for segue: \(CVC.images.count)")
    }
}

collectionViewControllercellForItemAt

override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "Cell", for: indexPath) as! CollectionViewCell
    // Configure the cell
    cell.cellImageView.image = images[indexPath.row].image

    cell.cellImageView.clipsToBounds = true
    let layout: UICollectionViewFlowLayout = UICollectionViewFlowLayout()
    layout.sectionInset = UIEdgeInsets(top: 0, left: 0, bottom: 10, right: 0)
    layout.itemSize = CGSize(width: (UIScreen.main.bounds.width-1)/2, height: (UIScreen.main.bounds.width-1)/2)
    layout.minimumInteritemSpacing = 1
    layout.minimumLineSpacing = 1
    collectionView.collectionViewLayout = layout
    cell.cellImageView.layer.cornerRadius = CGFloat((cell.cellImageView.frame.width)/2)
    return cell
}

Ошибка получена:

2018-01-25 11: 43: 16.228902-0500 Сервер CAR+CV(1.0) [4182:1181750] *** Завершение работы приложения из-за необработанного исключения "NSInternalInconsistencyException", причина: "Невозможно установить макет [] для [; слой =; contentOffset: {0, -88}; contentSize: {375, 573}; fixedContentInset: {88, 0, 83, 0}> макет представления коллекции: ] во время обновления.

1 ответ

Очень неправильный способ сделать это...

Во-первых, установите ваш collectionViewLayout в viewDidLoad()

Далее в prepareForSegueВы хотите изменить Данные представления коллекции, а не само представление коллекции.

Так...

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "unwindToCollectionView"{
        let CVC = segue.destination as! CollectionViewController
        if let image = image {
            // add the image to the CollectionViewController's data 
            CVC.images.insert(imagePost(image:image), at: 0)
            print("Image is not nil")
        }
        print("In prepare for segue: \(CVC.images.count)")
    }
}

Затем ваш просмотр коллекции cellForItemAt это просто:

override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "Cell", for: indexPath) as! CollectionViewCell

    // Configure the cell
    cell.cellImageView.image = images[indexPath.row].image

    // don't do this here...
    // cell.cellImageView.clipsToBounds = true
    // cell.cellImageView.layer.cornerRadius = CGFloat((cell.cellImageView.frame.width)/2)

    return cell
}

Редактировать: как примечание, настройка .cornerRadius не должно быть сделано в cellForItemAt либо, так как камера еще не будет разложена. Намного лучше подкласс UIImageView и установить .cornerRadius в layoutSubviews()


Изменить 2:

class RoundImageView: UIImageView {

    override func layoutSubviews() {
        super.layoutSubviews()

        self.clipsToBounds = true
        self.layer.cornerRadius = self.frame.width / 2.0

    }

}

Просто установите класс вашего текущего UIImageView в RoundImageView,

"где я могу вызвать insertItems(at:[index])"

Вам не нужно это делать. Когда ваш переход перейдет в контроллер представления, ваш сборный вид перезагрузится, и изображение, которое вы только что вставили в свой images массив станет первой ячейкой. Я заметил, что ваш идентификатор segue "unwindToCollectionView" - поэтому, если представление вашей коллекции не перезагружается автоматически, добавьте это в VC, содержащий представление коллекции:

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    collectionView.reloadData()
}
Другие вопросы по тегам