Приложение scrollToItemAtIndexPath вызывает опрос

поэтому я поместил следующий код в свою функцию viewDidLoad и он сработал приложение. какие-нибудь идеи, почему это происходит или что-то в этом роде?

self.collectionView?.scrollToItem(at: IndexPath(row: 0, section: 0), at: .top, animated: true) 

————— EDIT ————— добавлен журнал ошибок

 2016-12-26 18:40:08.354 ParseStarterProject-Swift[73829:1561943] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'attempt to scroll to invalid index path: <NSIndexPath: 0x608000226400> {length = 2, path = 0 - 0}' *** First throw call stack: ( 0 CoreFoundation 0x00000001066e7d4b __exceptionPreprocess + 171 1 libobjc.A.dylib 0x000000010614921e objc_exception_throw + 48 2 CoreFoundation 0x00000001067512b5 +[NSException raise:format:] + 197 3 UIKit 0x0000000107fb0e44 -[UICollectionView scrollToItemAtIndexPath:atScrollPosition:animated:] + 224 4 ParseStarterProject-Swift 0x00000001051a963c _TFC25ParseStarterProject_Swift18PackViewController13viewDidAppearfSbT_ + 700 5 ParseStarterProject-Swift 0x00000001051a9741 _TToFC25ParseStarterProject_Swift18PackViewController13viewDidAppearfSbT_ + 49 6 UIKit 0x0000000107808a6c -[UIViewController _setViewAppearState:isAnimating:] + 945 7 UIKit 0x0000000107809388 -[UIViewController _endAppearanceTransition:] + 197 8 UIKit 0x00000001077de28d -[UIPresentationController transitionDidFinish:] + 834 9 UIKit 0x00000001079f5f83 -[_UICurrentContextPresentationController transitionDidFinish:] + 42 10 UIKit 0x00000001077e1ef0 __56-[UIPresentationController runTransitionForCurrentState]_block_invoke_2 + 183 11 UIKit 0x00000001081a356c -[_UIViewControllerTransitionContext completeTransition:] + 102 12 UIKit 0x00000001077daddc -[UITransitionView notifyDidCompleteTransition:] + 251 13 UIKit 0x00000001077daaef -[UITransitionView _didCompleteTransition:] + 1539 14 UIKit 0x00000001077dd51c -[UITransitionView _transitionDidStop:finished:] + 104 15 UIKit 0x00000001076edbd5 -[UIViewAnimationState sendDelegateAnimationDidStop:finished:] + 222 16 UIKit 0x00000001076ee12a -[UIViewAnimationState animationDidStop:finished:] + 136 17 QuartzCore 0x0000000107392648 _ZN2CA5Layer23run_animation_callbacksEPv + 316 18 libdispatch.dylib 0x00000001098940cd _dispatch_client_callout + 8 19 libdispatch.dylib 0x00000001098748a4 _dispatch_main_queue_callback_4CF + 406 20 CoreFoundation 0x00000001066abe49 __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ + 9 21 CoreFoundation 0x000000010667137d __CFRunLoopRun + 2205 22 CoreFoundation 0x0000000106670884 CFRunLoopRunSpecific + 420 23 GraphicsServices 0x000000010bf76a6f GSEventRunModal + 161 24 UIKit 0x0000000107660c68 UIApplicationMain + 159 25 ParseStarterProject-Swift 0x00000001051966cf main + 111 26 libdyld.dylib 0x00000001098e068d start + 1 27 ??? 0x0000000000000001 0x0 + 1 ) libc++abi.dylib: terminating with uncaught exception of type NSException (lldb) 

Вероятная проблема

Имеет ли ваш источник данных CollectionView какие-либо данные, если он равен нулю, numberOfItemsInSection вернет 0 и потому, что вы запрашиваете collectionView для прокрутки до indexPath IndexPath(row: 0, section: 0) и потому, что ячейки там не могут быть повреждены.

Решение

  1. Убедитесь, что ваш источник данных не равен нулю или возвращает хотя бы одну ячейку

  2. прокрутите до указанного indexPath в ViewDidAppear после того, как collectionView будет перезагружен данными (предположим, что у вас будут некоторые данные к тому времени, когда будет вызван ViewDidAppear)

Работа вокруг

Задайте свой источник данных, если есть ячейка в indexPath(0,0) или нет, прежде чем запрашивать у CollectionView прокрутку до указанного indexPath

  if let _ = self.collectionView?.dataSource?.collectionView(self.collectionView!, cellForRowAt: IndexPath(row: 0, section: 0)) { self.collectionView?.scrollToItem(at: IndexPath(row: 0, section: 0), at: .top, animated: true) } 

РЕДАКТИРОВАТЬ:

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

В блоке завершения вызова webservice перезагрузите collectionView, а затем прокрутите список до определенного пути индекса.

Если вы используете огонь alamo или AFNetworking, блок завершения вызывается в основном потоке, в случае, если ваш блок завершения будет выполнен в фоновом потоке, обязательно переключитесь на основной поток перед перезагрузкой и прокруткой 🙂

Надеюсь, это поможет 🙂 Счастливое кодирование 🙂

Не могли бы вы попробовать:

  DispatchQueue.main.async { self.collectionView?.scrollToItem(at: IndexPath(row: 0, section: 0), at: .top, animated: true) } 

Могут быть много причин для этого краха. Вы можете остановить это, добавив несколько проверок, точно так же, как 1. проверить данные CollectionView 2. подождать 0,5 секунды, сначала полностью загрузить CollectionView и прокрутить его.

  • Конвертировать проект iPhone в iPad?
  • Как решить ошибку «Thread 1: SIGABRT error» при использовании SDK Google Maps для iOS в Xcode
  • Невозможно открыть симулятор iOS Xcode
  • Ошибка компоновщика SDK Facebook
  • Проблемы с iPad 3 и NSUserDefaults
  • Какова точка трассировки стека в Xcode?
  • Безопасность транспорта заблокировала простой текст HTTP (XCode 8)
  • Как отладить iOS 7.1 симулятор на Xcode 7?
  • Создать PDF на лету от NSMutableData
  • При использовании раскадровки и изменении вида звук не перестанет воспроизводиться в новом режиме
  • Как получить значение поля UIText, поскольку символы вводятся в режиме реального времени?
  • Давайте будем гением компьютера.