265 votes

Programmer le contrôleur de vue initial à l'aide de Storyboards

Comment puis-je définir de manière programmatique le InitialViewController pour un Storyboard ? Je veux ouvrir mon storyboard à une vue différente en fonction de certaines conditions qui peuvent varier d'un lancement à l'autre.

1 votes

Vérifiez cette réponse sans prévenir, sans effacer le storyboard principal dans les paramètres.

477voto

Travis Points 1286

Comment sans un contrôleur de vue initial factice

Assurez-vous que tous les contrôleurs de vue initiaux ont un ID de Storyboard.

Dans le storyboard, décochez l'attribut "Is initial View Controller" du premier contrôleur de vue.

Si vous exécutez votre application à ce stade, vous lirez :

Failed to instantiate the default view controller for UIMainStoryboardFile 'MainStoryboard' - perhaps the designated entry point is not set?

Et vous remarquerez que la propriété de votre fenêtre dans le délégué de l'application est maintenant nulle.

Dans le paramétrage de l'application, allez dans votre cible et dans la rubrique Info onglet. Là, effacez la valeur de Main storyboard file base name . Sur le General effacez la valeur de l'onglet Main Interface . Cela supprimera l'avertissement.

Créez la fenêtre et le contrôleur de vue initial souhaité dans le délégué de l'application. application:didFinishLaunchingWithOptions: méthode :

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:UIScreen.mainScreen.bounds];

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

    UIViewController *viewController = // determine the initial view controller here and instantiate it with [storyboard instantiateViewControllerWithIdentifier:<storyboard id>];

    self.window.rootViewController = viewController;
    [self.window makeKeyAndVisible];

    return YES;
}

7 votes

Amour ! Amour ! Amour ! Je vais l'utiliser pour basculer entre deux arbres de contrôleurs de vues complètement différents pour IOS6 et IOS7. C'est la meilleure façon de gérer la compatibilité avec le passé, tout en utilisant toutes les fonctionnalités d'IOS7.

6 votes

J'apprends la programmation iOS en Swift. Quelqu'un peut-il m'aider à écrire le code ci-dessus en Swift ? Merci.

0 votes

Toute personne qui peut répondre à la question de savoir pourquoi cela est fait dans les didFinishLaunchingWithOptions méthode ? J'ai besoin de basculer entre l'application d'embarquement/régulière et l'application d'embarquement. didFinishLaunchingWithOptions n'est appelé que lorsque vous installez l'application.

47voto

olinYY Points 518

Vous pouvez définir de manière programmatique le rootViewController de la fenêtre clé dans (BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)launchOptions

par exemple :

- (BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    if (shouldShowAnotherViewControllerAsRoot) {
        UIStoryboard *storyboard = self.window.rootViewController.storyboard;
        UIViewController *rootViewController = [storyboard instantiateViewControllerWithIdentifier:@"rootNavigationController"];
        self.window.rootViewController = rootViewController;
        [self.window makeKeyAndVisible];
    }

    return YES;
}

0 votes

Comment lancer ensuite le point d'entrée original à partir du UIViewController secondaire ?

0 votes

@ooxio : vous pouvez stocker le point d'entrée original dans un endroit global puis l'utiliser plus tard.

0 votes

C'est vraiment utile si vous voulez instancier pour vous connecter/enregistrer ou quelque chose comme ça...

7voto

mete Points 55

Ouvrez mainstoryboard, sélectionnez la vue que vous voulez démarrer en premier, puis ouvrez Utilities--> Attributs. Sous "View Controller", vous voyez le bouton radio "Is initial View Controller". Il suffit de le sélectionner.

--- A la question révisée :

Vous pouvez peut-être essayer ceci : écrire une méthode dans la section ViewDidLoad de votre vue initiale et lorsque la méthode s'exécute au lancement de l'application, la méthode déclenche une transition vers une autre vue.

0 votes

J'ai écrit la méthode dans le ViewDidLoad mais elle n'a pas fonctionné et quand je l'ai écrite dans le viewdidAppear elle fonctionne, pouvez-vous expliquer pourquoi cela se produit.

0 votes

Vous devriez peut-être essayer ceci : Ajoutez un code de ségrégation en fonction de vos conditions à l'une des méthodes appropriées du fichier appDelegate.m. Par exemple, vous pouvez ajouter un code de séparation à la méthode "applicationDidBecomeActive :".

0 votes

@Jagdev vous l'écrivez dans ViewDidAppear au lieu de ViewDidLoad.

3voto

Shmidt Points 5549

Je ne pense pas que ce soit possible. Au lieu de cela, vous pouvez avoir un contrôleur initial qui aura des segments vers différents contrôleurs de vue. Au démarrage, vous pouvez décider de la séquence à exécuter de manière programmatique.

1voto

mete Points 55

Il y a quelques jours, j'ai rencontré la même situation. Une astuce très simple a permis de résoudre ce problème. J'ai mis hidden mon contrôleur de vue initial avant launch2. Si le contrôleur de vue initial est le bon contrôleur, il est mis en visible dans viewDidLoad. Sinon, une transition est effectuée vers le contrôleur de vue souhaité. Cela fonctionne parfaitement sous iOS 6.1 et plus. Je suis sûr que cela fonctionne sur les versions antérieures d'iOS.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X