Search code examples
iosuitableviewmaster-detailxcode10ios12

iOS 12 SDK require autolayout?


I started a new project in Xcode 10 using iOS SDK 12. I selected the Master-Detail App template. I can run the app from the start without making any changes to the project and it works. But when the only change I make is I turn off auto layout in the Main.storyboard and the app crashes when selecting an item in the Master view and sends it to the Detail view. even though the only change I made was turning Autolayout off.

Does iOS 12 SDK require autolayout?

In Xcode 9, turning off Autolayout in a Master-Detail app template would not cause this crash.

Any help would be greatly appreciated, I know I should be transitioning to autolayout instead of doing everything manually but I have gotten there yet.

Below is the error that spits out.

    2018-10-08 11:16:02.968981-0400 Trial2[1100:19064] -[DetailViewController topViewController]: unrecognized selector sent to instance 0x7fbb3652b350
2018-10-08 11:16:02.981283-0400 Trial2[1100:19064] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[DetailViewController topViewController]: unrecognized selector sent to instance 0x7fbb3652b350'
*** First throw call stack:
(
    0   CoreFoundation                      0x000000010f2ce29b __exceptionPreprocess + 331
    1   libobjc.A.dylib                     0x000000010df3f735 objc_exception_throw + 48
    2   CoreFoundation                      0x000000010f2ecfa4 -[NSObject(NSObject) doesNotRecognizeSelector:] + 132
    3   UIKitCore                           0x0000000111cac163 -[UIResponder doesNotRecognizeSelector:] + 287
    4   CoreFoundation                      0x000000010f2d2fb6 ___forwarding___ + 1446
    5   CoreFoundation                      0x000000010f2d4e88 _CF_forwarding_prep_0 + 120
    6   Trial2                              0x000000010d61d049 -[MasterViewController prepareForSegue:sender:] + 361
    7   UIKitCore                           0x0000000111dc05c7 -[UIStoryboardSegueTemplate _performWithDestinationViewController:sender:] + 182
    8   UIKitCore                           0x0000000111dc04e3 -[UIStoryboardSegueTemplate _perform:] + 82
    9   UIKitCore                           0x0000000111dc07a5 -[UIStoryboardSegueTemplate perform:] + 157
    10  UIKitCore                           0x0000000111e19cbb -[UITableView _selectRowAtIndexPath:animated:scrollPosition:notifyDelegate:] + 1703
    11  UIKitCore                           0x0000000111e19f44 -[UITableView _userSelectRowAtPendingSelectionIndexPath:] + 344
    12  UIKitCore                           0x00000001118d097e _runAfterCACommitDeferredBlocks + 318
    13  UIKitCore                           0x00000001118bf424 _cleanUpAfterCAFlushAndRunDeferredBlocks + 384
    14  UIKitCore                           0x00000001118ee870 _afterCACommitHandler + 135
    15  CoreFoundation                      0x000000010f231037 __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 23
    16  CoreFoundation                      0x000000010f22b4ce __CFRunLoopDoObservers + 430
    17  CoreFoundation                      0x000000010f22bb61 __CFRunLoopRun + 1537
    18  CoreFoundation                      0x000000010f22b221 CFRunLoopRunSpecific + 625
    19  GraphicsServices                    0x00000001175f91dd GSEventRunModal + 62
    20  UIKitCore                           0x00000001118c5115 UIApplicationMain + 140
    21  Trial2                              0x000000010d61bef0 main + 112
    22  libdyld.dylib                       0x000000011099b551 start + 1
    23  ???                                 0x0000000000000001 0x0 + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException
(lldb) 

Update after Stephen Darlington's Answer

Initial Storyboard when the project was created.

How the storyboard was changed when Autolayout was turned off.

The first picture is how the Initial Storyboard when the project was created. The second picture is How the storyboard was changed when Autolayout was turned off.


Solution

  • This has nothing to do with autolayout. "Manual" layout is still full supported; autolayout is only Apple's preferred method.

    Instead the error is on the first line of your stack trace:

    -[DetailViewController topViewController]: unrecognized selector sent to instance 0x7fbb3652b350
    

    Looks like a UINavigationController has been removed somewhere and topViewController is being sent to a view controller instead.