Ошибка ТОЧКИ прерывания в делегате CollectionView `sizeForItemAt indexPath` в UICollectionViewFlowLayout

# #ios #swift #firebase #uicollectionview #crashlytics

Вопрос:

Я получаю одну аварию в Crashlytics, и тип аварии таков EXC_BREAKPOINT . Это сбой при sizeForItemAt indexpath просмотре метода сбора. Я не могу упрекнуть в аварии, и это происходит в основном на iPad. Похоже, сбой произошел из-за какой-то проблемы с компоновкой при изменении ориентации. Ниже приведена трассировка стека из firebase: —

Разбился: com.apple.основная тема

 0  Module1                          0x10587bb78 specialized TabViewController.collectionView(_:layout:sizeForItemAt:)   227 (TabViewController.swift:227)

1  Module1                          0x1058799a8 @objc TabViewController.collectionView(_:layout:sizeForItemAt:)   4892 (<compiler-generated>:4892)

2  UIKitCore                      0x1a7c288f0 -[UICollectionViewFlowLayout _getSizingInfosWithExistingSizingDictionary:]   2548

3  UIKitCore                      0x1a7c29eb4 -[UICollectionViewFlowLayout _fetchItemsInfoForRect:]   280

4  UIKitCore                      0x1a7c23d30 -[UICollectionViewFlowLayout prepareLayout]   224

5  UIKitCore                      0x1a7c1d594 -[UICollectionViewData _prepareToLoadData]   276

6  UIKitCore                      0x1a7c1ddb4 -[UICollectionViewData validateLayoutInRect:]   108

7  UIKitCore                      0x1a7be76e8 -[UICollectionView layoutSubviews]   228

8  UIKitCore                      0x1a8a1aa0c -[UIView(CALayerDelegate) layoutSublayersOfLayer:]   2576

9  QuartzCore                     0x1a8ea1670 -[CALayer layoutSublayers]   308

10 QuartzCore                     0x1a8ea1b54 CA::Layer::layout_if_needed(CA::Transaction*)   548

11 QuartzCore                     0x1a8eb678c CA::Layer::layout_and_display_if_needed(CA::Transaction*)   144

12 QuartzCore                     0x1a8df85e4 CA::Context::commit_transaction(CA::Transaction*, double, double*)   500

13 QuartzCore                     0x1a8e247f4 CA::Transaction::commit()   684

14 UIKitCore                      0x1a84e9554 __83-[UIApplication _createSnapshotContextForScene:withName:performLayoutWithSettings:]_block_invoke_4   48

15 UIKitCore                      0x1a84e890c -[UIApplication _performWithUICACommitStateSnapshotting:]   148

16 UIKitCore                      0x1a84e9488 __83-[UIApplication _createSnapshotContextForScene:withName:performLayoutWithSettings:]_block_invoke_2   604

17 UIKitCore                      0x1a8a0d920  [UIView(Animation) performWithoutAnimation:]   104

18 UIKitCore                      0x1a84e91f8 __83-[UIApplication _createSnapshotContextForScene:withName:performLayoutWithSettings:]_block_invoke   228

19 UIKitCore                      0x1a79603ec -[UIScene _applyOverrideSettings:forActions:]   124

20 UIKitCore                      0x1a875c814 -[UIWindowScene _applySnapshotSettings:forActions:]   48
 

Может кто-нибудь подсказать, в чем может быть причина аварии? Должны ли мы проверить, должно ли dataSource количество быть больше, чем indexpath.item в методах делегирования?

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

1. Возможно, при изменении ориентации в активную часть представления коллекции загружается больше элементов. Когда вы попытались воспроизвести ошибку, вы прокрутили до нижней части представления коллекции, а затем изменили ориентацию? Вы уверены, что у них есть связанная модель для каждой ячейки в представлении коллекции? По моему опыту, эти ошибки в основном возникают из-за того, что ячейки создаются для индексов, которые находятся вне диапазона.

2. @jacob_g проблема не воспроизводима, когда я прокручиваю страницу вниз, а затем меняю ориентацию. Да, для каждой ячейки в представлении коллекции есть модель, связанная с ней. Не удалось определить сценарий сбоя, но из журналов видно, что он в основном имеет ландшафтную ориентацию. У меня есть один вопрос здесь, должны ли мы добавить проверку для представления коллекции dataSource array count > indexPath.item , даже если мы уверены, что условие будет истинным.

3. Я бы добавил ведение журнала в функцию, выводя все, что вы можете, чтобы понять, в чем причина проблемы, включая информацию об источнике данных и indexPath