2013-05-22 5 views
58

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

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

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

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

Благодарности

ответ

69

Посмотрите на ваших настройках Target для проекта

enter image description here

Обратите внимание на параметр Main раскадровки.

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

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

Спасибо! Это отвечает на мой вопрос – agro1986

+0

. Добро пожаловать, если это так, вы должны пометить его как принятый, чтобы закрыть вопрос. –

+0

Сделано! Не знаю, как это сделать :) – agro1986

7

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

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

Большое спасибо за код! – agro1986

9

Дайте взглянуть на UIApplicationMain обсуждения:

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

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

enter image description here

Вот как он «понимает», что XIB/раскадровка файл должен загружаться.

+0

Большое вам спасибо! – agro1986

3

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

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

Если вы хотите инициализировать раскадровку в методе 'applicationDidFinishLoading' в' AppDelegate', вам также нужно создать объект 'window'. Например, вот так: 'window = UIWindow (frame: UIScreen.mainScreen(). Bounds)' –

+0

вы должны использовать let вместо var и использовать? вместо ! (даже если вы уверены), нет никакого реального наказания –

0

бит поздно к партии, но вы можете добраться до 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 
    } 
} 
2

В Xcode, человеческое считываемые Информация.PLIST раздел, который определяет основной раскадровка:

Main storyboard file base name

В виде простого текста, ключ UIMainStoryboardFile:

<key>UIMainStoryboardFile</key> 
<string>Main</string> 
Смежные вопросы