Я продолжаю получать сообщение об ошибке при добавлении новой ячейки в представление коллекции
Я пытаюсь добавить данные из одного контроллера представления в контроллер представления коллекции, который добавляет элемент в массив источника данных, а затем добавляет ячейку в представление коллекции.
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)")
}
}
collectionViewController
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
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()
}