0
votes

Shown below is the code I am using to transfer in between two view controllers in my code. This does not work and leads to the error THREAD 1 Signal SIGBART.

 func nextPage() {
    //we are on the last page
    if pageControl.currentPage == pages.count {
        /*moveControlConstraintsOffScreen()

        UIView.animate(withDuration: 0.5, delay: 0, usingSpringWithDamping: 1, initialSpringVelocity: 1, options: .curveEaseOut, animations: {
            self.view.layoutIfNeeded()
        }, completion: nil)
        */
        let vc = self.storyboard?.instantiateViewController(withIdentifier: "logloginControllerID") as! logloginController
        self.present(vc, animated: true, completion:nil)
    }

    //second last page
    if pageControl.currentPage == pages.count {
       return
    }

    let indexPath = IndexPath(item: pageControl.currentPage + 1, section: 0)
    collectionView.scrollToItem(at: indexPath, at: .centeredHorizontally, animated: true)
    pageControl.currentPage += 1
}

Here is the full console output when crashing:

2017-06-27 13:57:13.823 College Search[80667:48415876] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'attempt to scroll to invalid index path:  {length = 2, path = 0 - 3}'
*** First throw call stack:
(
    0   CoreFoundation                      0x0000000104121b0b __exceptionPreprocess + 171
    1   libobjc.A.dylib                     0x0000000103771141 objc_exception_throw + 48
    2   CoreFoundation                      0x000000010418a625 +[NSException raise:format:] + 197
    3   UIKit                               0x0000000105a0881f -[UICollectionView _contentOffsetForScrollingToItemAtIndexPath:atScrollPosition:] + 216
    4   UIKit                               0x0000000105a09250 -[UICollectionView scrollToItemAtIndexPath:atScrollPosition:animated:] + 70
    5   College Search                      0x0000000102d4387f _TFC14College_Search15LogInController8nextPagefT_T_ + 1343
    6   College Search                      0x0000000102d43a32 _TToFC14College_Search15LogInController8nextPagefT_T_ + 34
    7   UIKit                               0x00000001050c6d22 -[UIApplication sendAction:to:from:forEvent:] + 83
    8   UIKit                               0x000000010524b25c -[UIControl sendAction:to:forEvent:] + 67
    9   UIKit                               0x000000010524b577 -[UIControl _sendActionsForEvents:withEvent:] + 450
    10  UIKit                               0x000000010524a4b2 -[UIControl touchesEnded:withEvent:] + 618
    11  UIKit                               0x000000010513449a -[UIWindow _sendTouchesForEvent:] + 2707
    12  UIKit                               0x0000000105135bb0 -[UIWindow sendEvent:] + 4114
    13  UIKit                               0x00000001050e27b0 -[UIApplication sendEvent:] + 352
    14  UIKit                               0x000000011543175c -[UIApplicationAccessibility sendEvent:] + 85
    15  UIKit                               0x00000001058c5adc __dispatchPreprocessedEventFromEventQueue + 2926
    16  UIKit                               0x00000001058bda3a __handleEventQueue + 1122
    17  CoreFoundation                      0x00000001040c7c01 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 17
    18  CoreFoundation                      0x00000001040ad0cf __CFRunLoopDoSources0 + 527
    19  CoreFoundation                      0x00000001040ac5ff __CFRunLoopRun + 911
    20  CoreFoundation                      0x00000001040ac016 CFRunLoopRunSpecific + 406
    21  GraphicsServices                    0x0000000109a94a24 GSEventRunModal + 62
    22  UIKit                               0x00000001050c50d4 UIApplicationMain + 159
    23  College Search                      0x0000000102d4ac67 main + 55
    24  libdyld.dylib                       0x00000001070b165d start + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException
(lldb) 
2
You need to point out the exact line causing the crash and you need to include the complete error message shown in the debugger console.rmaddy
If the error is in the code you posted, I only see one possibly suspicious bit. Try removing as! logloginController and see what the value/type of vc is when you don't force it.Phillip Mills
removing as! leads to a a failed attempt at building the app. I was however able to find the whole error message using the debugger. It states: libc++abi.dylib: terminating with uncaught exception of type NSExceptionJohny Singh
SIGABRT generally means that the program threw an exception. There should be more information in the debugger console. You need to edit your question to include that information. Also, you can set a breakpoint in objc_exception_throw to get the stack trace where the exception is thrown.tek3

2 Answers

0
votes

Oh okay I see the edit. Let's say you have 3 pages like you have now. In the array of pages your pages are numbered 0, 1, 2.

Now let's say you're on the second to last page. That puts you at 1, right? Let's go to the next page, that's 2. Now, your logic (in your head) is saying if the current page = the pages.count then do something. This logic is saying in basic terms "load this view controller once I get to the last page".

What you're actually doing is something else. pages.count = 3 because you have 3 items in that array. So your currentPage has to equal 3 for that logic to work. So when your currentPage = 2 (which is actually the true last page) you skip that condition for currentPage == pages.count and you end up trying to load an indexpath for 3. That doesn't exist

So what you need to do is change your condition. Instead of currentPage == pages.count you need to make it:

currentPage == pages.count - 1

You should be fine after that.

0
votes
func nextPage() {
    //we are on the last page
    if pageControl.currentPage == pages.count {
        let vc = self.storyboard?.instantiateViewController(withIdentifier: "logloginControllerID") as! logloginController
        self.present(vc, animated: true, completion:nil)
    }else{
        let indexPath = IndexPath(item: pageControl.currentPage + 1, section: 0)
        collectionView.scrollToItem(at: indexPath, at: .centeredHorizontally, animated: true)
        pageControl.currentPage += 1
    }
}