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?)
Regardez vos paramètres de cible pour le projet
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;
}
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é:
C'est ainsi qu'il "comprend" que le fichier xib/storyboard doit être chargé.
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];
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()
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>
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
}
}