Сбой UICollectionView при вставке ячейки

#ios #uicollectionview #uicollectionreusableview

#iOS #uicollectionview #uicollectionreusableview

Вопрос:

У меня есть UICollectionView с дополнительным представлением нижнего колонтитула. То, как работает CollectionView, позволяет убрать дополнительный вид за пределы экрана при вставке новой ячейки. Ячейки могут иметь разные размеры по горизонтали.

Если вставлены две большие ячейки, а дополнительный вид удален с экрана, вставка маленькой ячейки между двумя большими ячейками приводит к сбою.

 *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', 
reason: 'the view returned from -collectionView:viewForSupplementaryElementOfKind:
atIndexPath (UICollectionElementKindCell,<NSIndexPath: 0xc00000000000000e> 
{length = 1, path = 0}) was not retrieved by calling 
-dequeueReusableSupplementaryViewOfKind:withReuseIdentifier:forIndexPath: or is nil ((null))'
  

Я определил, что сбой происходит из-за того, что дополнительное представление равно нулю. Это ноль, потому что в

  - (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView 
   viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath
  

Я проверяю, какой элемент был передан методу. При сбое приложения вид UICollectionElementKindCell, для которого у меня нет действительного ответа.

Итак, мой вопрос двоякий:
1) Почему viewForSupplementaryElementOfKind вызывается с типом, который не связан с моим дополнительным представлением? Я ожидаю, что UICollectionView должен пытаться получить дополнительную информацию о представлении только из этого метода.

2) Как можно избежать этого сбоя?

Комментарии:

1. вы можете вернуть любое представление из as it, но вы уже используете представление нижнего колонтитула, поэтому, возможно, попробуйте удалить его

Ответ №1:

Непонятно почему, но этот сбой был устранен путем переопределения метода

 - (BOOL)shouldInvalidateLayoutForBoundsChange:(CGRect)newBounds
  

и возвращает true, а также удаляет вызов invalidateLayout, который был в методах вставки.