web-dev-qa-db-fra.com

Comment Xcode charge-t-il le storyboard principal?

Lorsque je crée une nouvelle application à vue unique dans Xcode 4.6 à l'aide d'un storyboard, nous pouvons voir que la fonction principale crée une nouvelle application à l'aide du délégué d'application, comme ceci:

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

Toutefois, si nous examinons MyAppDelegate.h et MyAppDelegate.m, il n’ya nulle part dans le code qui fasse référence à MainStoryboard.storyboard. Cela diffère d'une version non-storyboard où nous pouvons trouver la ligne de code qui charge le fichier nib par programme.

Ma question est donc la suivante: comment charger le storyboard? (Où devrais-je piquer pour le trouver?)

61
agro1986

Regardez vos paramètres de cible pour le projet

enter image description here

Notez le réglage du scénario principal.

Si vous vouliez le faire vous-même dans le code, vous feriez quelque chose comme.

- (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;
}
71
Chris Wagner

Jetez un coup d’œil à la discussion UIApplicationMain

Discussion
Cette fonction instancie l'objet d'application à partir de la classe principale et installe le délégué (le cas échéant) à partir de la classe donnée et définit le délégué pour l'application. Il configure également la boucle d’événements principale, y compris la boucle d’exécution de l’application, et commence le traitement des événements. Si le fichier Info.plist de l’application spécifie le fichier nib principal à charger en incluant la clé NSMainNibFile et un nom de fichier nib valide pour la valeur, cette fonction le charge.

Lorsque UIApplicationMain est appelé, un fichier plist contenant toutes les informations sur l'application est chargé: 

enter image description here

C'est ainsi qu'il "comprend" que le fichier xib/storyboard doit être chargé.

9
Ramy Al Zuhouri

Il est lancé à partir du paramètre UIMainStoryboardFile de votre fichier info.plist. Xcode crée ensuite une fenêtre principale, instancie votre premier contrôleur de vue et l'ajoute à la fenêtre. Vous pouvez toujours le faire dans un code similaire au .nib en utilisant 

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

Si vous voulez instancier avec Swift

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

Dans Xcode, la section Info.plist lisible par l'homme qui détermine le storyboard principal est la suivante:

Main storyboard file base name

En texte brut, la clé est UIMainStoryboardFile:

<key>UIMainStoryboardFile</key>
<string>Main</string>
2
pkamb

Un peu tard dans la soirée mais vous pouvez accéder au viewController à partir de la fenêtre, comme indiqué ci-dessous

@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
    }
}
0
Tien Dinh