Я застрял в странной катастрофе и пытался исправить ее весь день. У меня есть пользовательский UICollectionViewLayout, который в основном добавляет силы тяжести и столкновения по отношению к ячейкам.CollectionView + UIKit Динамика сбой на performBatchUpdates:
Реализация отлично работает! Проблема возникает, когда я пытаюсь удалить одну ячейку, используя: [self.collectionView performBatchUpdates:].
Это дает мне следующую ошибку:
2013-12-12 21:15:35.269 APPNAME[97890:70b] *** Assertion failure in -[UICollectionViewData validateLayoutInRect:], /SourceCache/UIKit_Sim/UIKit-2935.58/UICollectionViewData.m:357
2013-12-12 20:55:49.739 APPNAME[97438:70b] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'UICollectionView recieved layout attributes for a cell with an index path that does not exist: <NSIndexPath: 0x975d290> {length = 2, path = 0 - 4}'
Моя модель обрабатывается правильно, и я могу видеть, что удаление элемента из него!
Индексированные объекты элемента для удаления передаются правильно между объектами. Единственный раз, когда обновление коллекцииView не возникает, когда я удаляю последнюю ячейку на нем, в противном случае происходит сбой.
Вот код, который я использую для удаления ячейки.
- (void)removeItemAtIndexPath:(NSIndexPath *)itemToRemove completion:(void (^)(void))completion
{
UICollectionViewLayoutAttributes *attributes = [self.dynamicAnimator layoutAttributesForCellAtIndexPath:itemToRemove];
[self.gravityBehaviour removeItem:attributes];
[self.itemBehaviour removeItem:attributes];
[self.collisionBehaviour removeItem:attributes];
[self.collectionView performBatchUpdates:^{
[self.fetchedBeacons removeObjectAtIndex:itemToRemove.row];
[self.collectionView deleteItemsAtIndexPaths:@[itemToRemove]];
} completion:nil];
}
Делегаты CollectionView, которые обрабатывают ячейки, являются базовыми ниже.
- (CGSize)collectionViewContentSize
{
return self.collectionView.bounds.size;
}
- (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect
{
return [self.dynamicAnimator itemsInRect:rect];
}
- (UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath
{
return [self.dynamicAnimator layoutAttributesForCellAtIndexPath:indexPath];
}
Вещи, которые я уже пытался, но безуспешно: - основание недействительности макет - обновление данных - Удаление поведения из UIDynamicAnimator и добавить их снова после обновления
Любые идеи?
Исходный код с проблемой доступен в этом репозитории. Пожалуйста, проверьте это. Code Repository
Лучший. Джордж.
Попробуйте добавить некоторый код в метод делегата данных, который возвращает ячейку и мониторинга запросов на консоли. Аналогичным образом добавьте регистрацию в методы, возвращающие число секций, количество ячеек. Возможно, cv запрашивает последнее, прежде чем он даже начнет пакетное обновление (в этом случае вам нужно переместить маяк, чтобы удалить из блока раньше. На самом деле, я сочувствую - пакетное обновление работало отлично для меня, я сделал небольшой измените мои ячейки (добавленные виды) и wham, он начал рушиться повсюду, и мне пришлось сделать все изменения, используя reload :-( –
Спасибо Дэвиду. Вот вывод последовательности загрузки, удаления и сбоя. ok. [Ссылка на журнал вывода] (https://dl.dropboxusercontent.com/u/7373916/output.txt) –
Можете ли вы добавить журналы до и после executeBatchUpdates и внутри блока до, в середине и после каждой строки кода Также, чтобы сделать меня счастливым, добавьте в журнал количество элементов в self.fetchedBeacons после удаления (сделайте это сообщение в среднем журнале), затем обновите журнал. Я знаю, что это PITA, но то, что я делал с CV, написано очень просто одно приложение просмотра, которое использовало метки в ячейках, чтобы играть с различными режимами работы вещи. Если это работает, и сложный код не сводит его CV (скорее всего). Кажется, CV меняет поведение на то, насколько сложны клетки, что действительно затрудняет нам! –