Как Xcode загружает основную раскадровку?

Когда я создаю новое приложение с одним представлением в Xcode 4.6 с использованием раскадровки, мы видим, что основная функция создает новое приложение с использованием делегата приложения, например:

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

Однако, если мы посмотрим на MyAppDelegate.h и MyAppDelegate.m, в коде нет нигде ссылки на MainStoryboard.storyboard. Это отличается от версии без раскадровки, где мы можем найти строку кода, которая загружает файл пера программно.

Итак, мой вопрос, как раскадровка загружается? (куда мне ткнуть, чтобы найти его?)

Ответ 1

Посмотрите на свои целевые настройки для проекта

enter image description here

Обратите внимание на настройку основной раскадровки.

Если вы хотели сделать это в коде самостоятельно, вы бы сделали что-то вроде.

- (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;
}

Ответ 2

Посмотрите на обсуждение UIApplicationMain:

Обсуждение
Эта функция создает экземпляр объекта приложения из основного класса и создает экземпляр делегата (если он есть) из данного класса и задает делегат для приложения. Он также устанавливает основной цикл событий, включая цикл запуска приложений, и начинает обработку событий. Если файл Info.plist приложений указывает основной загружаемый файл nib, включая ключ NSMainNibFile и действительное имя файла nib для значения, эта функция загружает этот файл nib.

Когда вызывается UIApplicationMain, загружается файл plist, содержащий всю информацию о приложении:

enter image description here

Что он "понимает", что файл xib/раскадровки должен загружаться.

Ответ 3

Он запускается из настройки UIMainStoryboardFile из файла info.plist. Затем Xcode создает главное окно, создает экземпляр вашего первого контроллера представления и добавляет его в окно. Вы все еще можете сделать это в коде, подобном .nib, используя

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

Ответ 4

Если вы хотите создать экземпляр с помощью Swift

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

Ответ 5

В Xcode секция Info.plist, читаемая человеком, которая определяет основную раскадровку:

Main storyboard file base name

В обычном тексте ключ UIMainStoryboardFile:

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

Ответ 6

Бит опоздал на вечеринку, но вы можете перейти к viewController из окна, как показано ниже.

@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
    }
}