web-dev-qa-db-fra.com

Changer par programme rootViewController de storyBoard

J'ai créé mon projet en utilisant Storyboards. La racine ViewController se trouve dans un Storyboard, je n'ai pas écrit un seul code dans le appDelegate.

Maintenant, je veux montrer un tour de mon application, alors je veux changer la racine ViewController de Tab Bar sur mon TourVC et lorsque la visite de l'application est terminée, je souhaite revenir à ma racine ViewController en Tab Bar.

J'ai donc cherché en ligne et suivi les points suivants

1) Supprimez Storyboards du fichier app.plist, 2) Décochez l'option "isInitialViewController" de Storyboards qui est cochée dans le cas de Tab Bar contrôleur parce que c'est une racine ViewController, 3) Ajoutez ce code dans le fichier appDelegate.m.

self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
ProductTourViewController *PT = [[ProductTourViewController alloc] initWithNibName:@"ProductTourViewController" bundle:nil];
self.window.rootViewController = PT;
[self.window makeKeyAndVisible];
return YES;

Mais mon application se bloque avec ce journal des erreurs,

[ProductTourViewController selectedViewController]: unrecognized selector sent to instance 0x1766a9e0

Et aussi je reçois un avertissement,

Unsupported Configuration: Scene is unreachable due to lack of entry points and does not have an identifier for runtime access via -instantiateViewControllerWithIdentifier:.
45
Ranjit

Objectif c:

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
UITabBarController *rootViewController = [storyboard instantiateViewControllerWithIdentifier:@"tabBarcontroller"];
[[UIApplication sharedApplication].keyWindow setRootViewController:rootViewController];

Rapide :

 let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
 let viewController = mainStoryboard.instantiateViewControllerWithIdentifier("tabBarcontroller") as UITabBarController  
   UIApplication.sharedApplication().keyWindow?.rootViewController = viewController;

Swift 3:

let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
let viewController = mainStoryboard.instantiateViewController(withIdentifier: "tabBarcontroller") as! UITabBarController
UIApplication.shared.keyWindow?.rootViewController = viewController
138
Sunny Shah

enter image description here Définissez l’identifiant du storyboard de votre classe dans votre storyboard principal.

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

UINavigationController *controller = (UINavigationController*)[MainStoryboard
                                                                           instantiateViewControllerWithIdentifier: @"RootNavigationController"];


LoginViewController *login=[MainStoryboard instantiateViewControllerWithIdentifier:@"LoginViewController"];
            [controller setViewControllers:[NSArray arrayWithObject:login] animated:YES];
self.window.rootViewController=controller;
11
Mayank Jain

Dans Swift nous pouvons l'implémenter comme suit

let storyboard = UIStoryboard(name: "StartingPage", bundle: NSBundle.mainBundle())      
let loginView: SignInVC = storyboard.instantiateViewControllerWithIdentifier("SignInVC") as! SignInVC
UIApplication.sharedApplication().keyWindow?.rootViewController = loginView
7
Nischal Hada

J'utilise simple ceci:

UIStoryboard *sb = [UIStoryboard storyboardWithName:@"NameOfStoryBoard" bundle:nil];
UITabBarController *rootViewController = [sb instantiateViewControllerWithIdentifier:@"NameOfTabBarController"];
[[UIApplication sharedApplication].keyWindow setRootViewController:rootViewController];
6
MUHAMMAD WASIM

Pour ajouter à la réponse de Sunny Shah, voici la version Swift 3:

        let mainStoryBoard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
        let viewController: UIViewController = mainStoryBoard.instantiateViewController(withIdentifier: "MainTabBarController") as! UITabBarController
        UIApplication.shared.keyWindow?.rootViewController = viewController
3
Aldo Gomez

Ceci est un ancien article, mais je vais répondre. Je ne recommande pas le code suivant.

let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
let viewController = mainStoryboard.instantiateViewController(withIdentifier: "tabBarcontroller") as! UITabBarController
UIApplication.shared.keyWindow?.rootViewController = viewController

Parce que vous créez deux instances. Je recommande d'écrire le code suivant dans le ViewController approprié.

let appDelegate = UIApplication.shared.delegate as! AppDelegate
appDelegate.window?.rootViewController = self
2
WaFuNuke

Swift 3 code:

Utilisez ci-dessous dans la fonction didFinishLaunchingWithOptions Appdelegate. Remplacez "HomeViewController" par ViewController que vous souhaitez définir comme ViewController racine lors du lancement de l'application.

self.window = UIWindow(frame: UIScreen.main.bounds)

let storyboard = UIStoryboard(name: "Main", bundle: nil)

let initialViewController = storyboard.instantiateViewController(withIdentifier: "HomeViewController")

self.window?.rootViewController = initialViewController
self.window?.makeKeyAndVisible()

return true
1
Karan Dua

Objectif c

étape 1: supprimer le scénario principal de info.plist

étape 2: ajoutez un identifiant de storyboard à votre contrôleur de vue dans votre constructeur d'interface

étape 3: ajouter le code suivant à l'application a terminé la méthode dans le délégué de l'application

self.window = [[UIWindow alloc] initWithFrame: [UIScreen mainScreen].bounds];


//set main story board
if( condition){
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"StoryboardName1" bundle:nil];
    UIViewController *rootViewController = [storyboard instantiateViewControllerWithIdentifier:@"ViewController1"];
    [[UIApplication sharedApplication].keyWindow setRootViewController:rootViewController];
    [self window].rootViewController = rootViewController;
    [self.window makeKeyAndVisible];
}else{
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"StoryboardName2" bundle:nil];
    UIViewController *rootViewController = [storyboard instantiateViewControllerWithIdentifier:@"ViewController2"];
    [[UIApplication sharedApplication].keyWindow setRootViewController:rootViewController];
    [self window].rootViewController = rootViewController;
    [self.window makeKeyAndVisible];
}
1
Daniel Raouf