so i have placed the following code in my viewDidLoad function and it crashes the app. any ideas why this happens or a way around this?
self.collectionView?.scrollToItem(at: IndexPath(row: 0, section: 0), at: .top, animated: true)
---------------EDIT--------------- added error log
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)
Probable problem
Does your collectionView
data source has any data, if it is nil, numberOfItemsInSection
will return 0 and because you are asking collectionView
to scroll to indexPath IndexPath(row: 0, section: 0)
and because cells not there it might crash.
Solution
Make sure your data source is not nil or returns at least one cell always
scroll to specified indexPath in viewDidAppear
once the collectionView is reloaded with data (Assuming that you will have some data by the time viewDidAppear
gets called)
Work Around
Ask your data source if there is a cell at indexPath(0,0)
or not before asking collectionView to scroll to the specified 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)
}
EDIT:
As you have mentioned that the data comes from server, the correct solution would be to reload the collectionView once you receive the web response.
In the completion block of webservice call reload the collectionView and then scroll to specific index path.
If you are using alamo fire or AFNetworking
, completion block gets called on main thread, in case your completion block gets executed in background thread make sure to switch to main thread before reloading and scrolling :)
Hope it helps :) Happy coding :)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With