11

Итак, базовый обзор. У меня есть UICollectionView, что мне нужно поддерживать добавление и удаление элемента через метод performBatchUpdates:. Если я использую стандарт UICollectionViewFlowLayout, он отлично работает.Использование [UICollectionView performBatchUpdates:] с UICollectionViewFlowLayout с UIDynamics

Однако, когда я пытаюсь использовать UICollectionViewFlowLayout, который питается от UIDynamicAnimator, я получаю сбой, как только я звоню performBatchChanges.

В моем классе UICollectionViewFlowLayout метод prepareForCollectionViewUpdates: так и не получил. Пользовательский UICollectionViewFlowLayout, который я использую, основан на this sample.

Выход консоли после аварии является ...

*** Assertion failure in -[UICollectionViewData layoutAttributesForItemAtIndexPath:], /SourceCache/UIKit/UIKit-2903.23/UICollectionViewData.m:581 
*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'no UICollectionViewLayoutAttributes instance for -layoutAttributesForItemAtIndexPath: <NSIndexPath: 0xc000000000028096> {length = 2, path = 2 - 5}' 
*** First throw call stack: 
libc++abi.dylib: terminating with uncaught exception of type NSException 

Любые идеи?

+0

Вы нашли исправление для этого? Ниже приведен ответ, когда ячейка не видна, но это происходит со мной, когда ячейка видна, и это случайный сбой, происходящий в prod, который я не могу воспроизвести. Я даже не использую UIDynamicAnimator – aryaxt

+0

Ответ ударил для меня, это было правильное решение для меня. –

ответ

13

попробовать

- (UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath { 
    UICollectionViewLayoutAttributes *layoutAttributes = [self.dynamicAnimator layoutAttributesForCellAtIndexPath:indexPath]; 
    if(!layoutAttributes) { 
     layoutAttributes = [super layoutAttributesForItemAtIndexPath:indexPath]; 
    } 
    return layoutAttributes; 
} 

при выполнении performBatchUpdates, [self.dynamicAnimator layoutAttributesForCellAtIndexPath: возвращается nil если ячейка, которая будет создана обновление не видно. Так что просто возвращается super (возможно, UICollectionViewFlowLayout) ' s layoutAttributes пока. И когда ячейка, которая будет отображаться, UIDynamicAnimator сделает эту работу за вас.

+0

это знающий ответ! благодаря! bountied ... – Fattie

+0

Как я должен использовать ваш код, у меня есть [аналогичная проблема] (https://stackoverflow.com/q/46599911/6536841). –