2016-09-08 2 views
1

Я пытаюсь удалить ячейку из своего UICollectionView. Я использую настраиваемый макет, и удаление происходит в ответ на длинный распознаватель жестов нажатия, который я добавил в представление коллекции. Из того, что я прочитал, мне нужно сначала обновить источник данных, а затем удалить ячейки, что я и делаю. Все идет гладко до self.collectionView?.deleteItemsAtIndexPaths([indexPath]). Я получаю сообщение об ошибке:UICollectionView Cell Deletion

*** Завершение приложения из-за неперехваченного исключения «NSInternalInconsistencyException», причина: «UICollectionView получил атрибуты макета для ячейки с отсутствием пути указателя: {length = 2, path = 0 - 0} '

Я читал другие подобные вопросы, но не могу заставить его работать.

let book = self.booksForCurrentAuthor[indexPath.row] 

self.booksForCurrentAuthor.removeAtIndex(indexPath.row) 
self.collectionView?.deleteItemsAtIndexPaths([indexPath]) 

//Delete book from database 

Редактировать

Я не думаю, что это имеет отношение, но в моем объекте пользовательский макет, создать тайник UICollectionViewLayoutAttributes из внутри метода prepareLayout(). Кэш - это словарь с отдельными массивами для атрибутов заголовков, ячеек, нижних колонтитулов и декораций.

+0

Просто предложение: используйте 'indexPath.item', когда вы используете UICollectionView. –

+0

Сделано изменение - есть ли функциональная разница при использовании несколько стандартного вида просмотра коллекций? – cweber105

+0

Нет. Оба являются вспомогательными устройствами доступа для второго индекса в пути. –

ответ

2

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

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

После того как вы удалили соответствующую запись из своего источника данных, вызовите cache.removeAll(), а затем снова вызовите prepareLayout(), чтобы обновить кеш макета. После этого вызовите collectionView.reloadData() (и, возможно, также layoutSubviews() и setNeedsDisplay), и это должно устранить вашу проблему. обратите внимание, что на самом деле вам не нужно удалять ячейку, поскольку коллекцияView автоматически загружается в то, что ей нужно, из выгруженного пакета ячеек.

Дайте мне знать, как вы поживаете. Всего найлучшего.

+0

Это, по сути, правильно. Я не очень хорошо разрабатывал пользовательский макет, поэтому он не воссоздавал и не выдавал атрибуты динамически по мере изменения данных. Как только я обновил ряд методов учета изменений в данных, он работал нормально. Спасибо. – cweber105

0

Вы пробовали решение от Delete cell from UICollectionView?

В вашем случае это будет что-то вроде этого:

[self.collectionView performBatchUpdates:^{ 
     let book = self.booksForCurrentAuthor[indexPath.row] 
     self.booksForCurrentAuthor.removeAtIndex(indexPath.row) 
     self.collectionView?.deleteItemsAtIndexPaths([indexPath]) 
    } completion:nil]; 
+0

Да. Такая же ошибка. – cweber105

Смежные вопросы