How does Xcode load the main storyboard?

IosObjective CXcode

Ios Problem Overview


When I create a new single view application in Xcode 4.6 using storyboard, we can see that the main function creates a new application using the application delegate like this:

return UIApplicationMain(argc, argv, nil, NSStringFromClass([MyAppDelegate class]));

However if we look at MyAppDelegate.h and MyAppDelegate.m, there is nowhere in the code that references MainStoryboard.storyboard. This differs from a non-storyboard version where we can find the line of code that loads the nib file programmatically.

So my question is, how does the storyboard get loaded? (where should I poke to find it?)

Ios Solutions


Solution 1 - Ios

Look at your Target settings for the Project

enter image description here

Notice the Main Storyboard setting.

If you wanted to do this in code yourself, you would do something like.

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{

   UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:[NSBundle mainBundle]];
   UIViewController *vc = [storyboard instantiateInitialViewController];

   // Set root view controller and make windows visible
   self.window.rootViewController = vc;
   [self.window makeKeyAndVisible];

   return YES;
}

Solution 2 - Ios

Give a look to the UIApplicationMain discussion:

>Discussion
This function instantiates the application object from the principal class and instantiates the delegate (if any) from the given class and sets the delegate for the application. It also sets up the main event loop, including the application’s run loop, and begins processing events. If the application’s Info.plist file specifies a main nib file to be loaded, by including the NSMainNibFile key and a valid nib file name for the value, this function loads that nib file.

When UIApplicationMain gets called, a plist file containing all the application info is loaded:

enter image description here

That's how it "understands" that the xib/storyboard file needs to get loaded.

Solution 3 - Ios

It is started from the UIMainStoryboardFile setting from your info.plist file. Xcode then creates a main window, instantiates your first view controller, and adds it to the window. You can still do this in code similar to the .nib using

UIStoryboard* storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
UIViewController* initialView = [storyboard instantiateInitialViewController];

Solution 4 - Ios

In Xcode, the human-readable Info.plist section that determines the main storyboard is:

Main storyboard file base name

In plain text, the key is UIMainStoryboardFile:

<key>UIMainStoryboardFile</key>
<string>Main</string>

Solution 5 - Ios

If you want to instantiate with Swift

var storyboard = UIStoryboard(name: "Main", bundle: NSBundle.mainBundle())
var vc : AnyObject! = storyboard.instantiateInitialViewController()
self.window!.rootViewController = vc as UIViewController
self.window!.makeKeyAndVisible()

Solution 6 - Ios

In Xcode 11.3.1, changing Main storyboard file base name alone is not enough, there's a Storyboard Name configuration in the Application Scene Manifest that should also be changed as well.

    <key>UIApplicationSceneManifest</key>
    <dict>
        <key>UIApplicationSupportsMultipleScenes</key>
        <false/>
        <key>UISceneConfigurations</key>
        <dict>
            <key>UIWindowSceneSessionRoleApplication</key>
            <array>
                <dict>
                    <key>UISceneConfigurationName</key>
                    <string>Default Configuration</string>
                    <key>UISceneDelegateClassName</key>
                    <string>$(PRODUCT_MODULE_NAME).SceneDelegate</string>
                    <key>UISceneStoryboardFile</key>
                    <string>Home</string>
                </dict>
            </array>
        </dict>
    </dict>

Solution 7 - Ios

Bit late to the party but you can get to the viewController from the window as shown below

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
   
        var viewController = window?.rootViewController as? ViewController
        if let viewController = viewController {
            // do awesome stuff
        }
    
        return true
    }
}

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questionagro1986View Question on Stackoverflow
Solution 1 - IosChris WagnerView Answer on Stackoverflow
Solution 2 - IosRamy Al ZuhouriView Answer on Stackoverflow
Solution 3 - IoszimmryanView Answer on Stackoverflow
Solution 4 - IospkambView Answer on Stackoverflow
Solution 5 - IosBeanwahView Answer on Stackoverflow
Solution 6 - IoskuraisView Answer on Stackoverflow
Solution 7 - IosTien DinhView Answer on Stackoverflow