Search code examples
iosios7xcode6uisplitviewcontroller

Window's root view controller is not Split view controller


I am trying to modify my existing app to use a split view controller. I've followed the sample master/detail project structure by adding a split view controller into my storyboard, made it the initial view controller and everything seemed to be working fine, until I tried to run the app in an iOS 7 simulator. All of a sudden when I hit my breakpoint in application: didFinishLaunchingWithOptions self.window.rootViewController is now the type of my master view controller, not the split view controller itself.

I thought maybe then I just need to get the split view controller off of the root view itself and tried rootViewController.splitViewController but that is nil. I must have missed some set up step in enabling this split view controller, but I have no idea what it was.


Solution

  • So this ended up being a pretty obscure issue. It seemed to be caused by the way that the iOS 8 SDK and Xcode 6 handle storyboards and size classes. I intend to file a bug report with apple but the repro steps to get this to present are simple:

    1. Create a new master/detail application
    2. Set deployment target to below 8.0 (7/7.1 works)
    3. Change application type from "Universal" to "iPad"
    4. You have to comment out this line from the generated app delegate, it will crash in an iOS 7 target:

      navigationController.topViewController.navigationItem.leftBarButtonItem = splitViewController.displayModeButtonItem;
      
    5. Run on iPad simulator for iOS 7.1

    The fix to this issue is to disable size classes on the storyboard. I theorize that the way that Xcode 6 and the iOS 8 SDK are handling size classes for iPad versus universal app builds causes this to not work on iOS 7 targets, but turning off size classes fixes the issue.