Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

collectionview scrollToItemAtIndexPath crashes app

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) 
like image 748
Pippo Avatar asked Dec 07 '22 20:12

Pippo


1 Answers

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

  1. Make sure your data source is not nil or returns at least one cell always

  2. 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 :)

like image 65
Sandeep Bhandari Avatar answered Dec 22 '22 03:12

Sandeep Bhandari