[ios] Définissez par programme le contrôleur de vue initial à l'aide de Storyboards



Answers

Pour tous les amoureux de Swift , voici la réponse de @Travis traduite en SWIFT :

Faites ce que @Travis a expliqué avant le code Objective C. Alors,

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

    self.window = UIWindow(frame: UIScreen.mainScreen().bounds)
    let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
    var exampleViewController: ExampleViewController = mainStoryboard.instantiateViewControllerWithIdentifier("ExampleController") as! ExampleViewController

    self.window?.rootViewController = exampleViewController

    self.window?.makeKeyAndVisible()

    return true
}

Le ExampleViewController est le nouveau contrôleur de vue initial que vous souhaitez afficher.

Les étapes expliquées:

  1. Créer une nouvelle fenêtre avec la taille de la fenêtre actuelle et la définir comme notre fenêtre principale
  2. Instancier un storyboard que nous pouvons utiliser pour créer notre nouveau contrôleur de vue initial
  3. Instancier notre nouveau contrôleur de vue initial basé sur son ID Storyboard
  4. Réglez le contrôleur de vue racine de notre nouvelle fenêtre en tant que notre nouveau contrôleur que nous venons d'initier
  5. Rendre notre nouvelle fenêtre visible

Profitez et bonne programmation!

Question

Comment est-ce que je programme par programme l' InitialViewController pour un Storyboard? Je souhaite ouvrir mon storyboard à une vue différente en fonction de certaines conditions qui peuvent varier d'un lancement à l'autre.




Swift 4, Xcode 9

dans le fichier AppDelegate.swift

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    let storyboard = UIStoryboard(name: "Main", bundle: nil)
    let firstVC = storyboard.instantiateViewController(withIdentifier: "firstViewController") as! firstViewController
    self.window?.rootViewController = firstVC
}



Ouvrez le tableau principal, sélectionnez l'affichage que vous voulez démarrer en premier, puis ouvrez Utilitaires -> Attributs. En dessous du "View Controller", vous voyez le bouton radio "Is initial View Controller". Il suffit de le sélectionner.

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

Peut-être pouvez-vous essayer ceci: écrivez une méthode dans la section ViewDidLoad de votre vue initial et lorsque la méthode s'exécute au lancement de l'application, la méthode déclenche une segmentation vers une autre vue.




Solution simple et facile à trouver - inutile de supprimer le "contrôle initial du contrôleur de vue" du storyboard et de modifier l'onglet Info du projet et d'utiliser makeKeyAndVisible , juste

self.window.rootViewController = rootVC;

dans

- (BOOL) application:didFinishLaunchingWithOptions:



Swift 3: Mise à jour du code de @ victor-sigler

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    self.window = UIWindow(frame: UIScreen.main.bounds)

    // Assuming your storyboard is named "Main"
    let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)

    // Add code here (e.g. if/else) to determine which view controller class (chooseViewControllerA or chooseViewControllerB) and storyboard ID (chooseStoryboardA or chooseStoryboardB) to send the user to

    if(condition){
        let initialViewController: chooseViewControllerA = mainStoryboard.instantiateViewController(withIdentifier: "chooseStoryboardA") as! chooseViewControllerA
        self.window?.rootViewController = initialViewController
    )
    }else{
        let initialViewController: chooseViewControllerB = mainStoryboard.instantiateViewController(withIdentifier: "chooseStoryboardB") as! chooseViewControllerB
        self.window?.rootViewController = initialViewController
    )

    self.window?.makeKeyAndVisible(

    return true
}



Vous pouvez définir initial view controller utilisant Interface Builder ainsi que par programmation.

Ci-dessous, l'approche utilisée pour le programme.

Objectif c :

        self.window = [[UIWindow alloc] initWithFrame:UIScreen.mainScreen.bounds];
        UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];

        UIViewController *viewController = [storyboard instantiateViewControllerWithIdentifier:@"HomeViewController"]; // <storyboard id>

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

        return YES;

Rapide :

        self.window = UIWindow(frame: UIScreen.mainScreen().bounds)
        let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)

        var objMainViewController: MainViewController = mainStoryboard.instantiateViewControllerWithIdentifier("MainController") as! MainViewController

        self.window?.rootViewController = objMainViewController

        self.window?.makeKeyAndVisible()

        return true



Une autre solution avec l'utilisation de Swift 3 et Swift 4 avec éviter la coulée de force est comme ceci

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    self.window = UIWindow(frame: UIScreen.main.bounds)
    let storyboard = UIStoryboard(name: "Main", bundle: nil)
    guard let viewController = storyboard.instantiateViewController(withIdentifier: "YourViewController") as? YourViewController else {
        return false
    }
    self.window?.rootViewController = viewController
    self.window?.makeKeyAndVisible()
    return true
}

Et ci-dessous utilise avec UINavigationController

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    self.window = UIWindow(frame: UIScreen.main.bounds)
    let storyboard = UIStoryboard(name: "Main", bundle: nil)
    guard let viewController = storyboard.instantiateViewController(withIdentifier: "YourViewController") as? YourViewController else {
        return false
    }
    let navigationController = UINavigationController(rootViewController: viewController)
    self.window?.rootViewController = navigationController
    self.window?.makeKeyAndVisible()
    return true
}



Il y a quelques jours, j'ai rencontré la même situation. Une astuce très simple a résolu ce problème. J'ai mis mon contrôleur de vue initial caché avant le lancement2. Si le contrôleur de vue initial est le bon contrôleur, il est visible dans viewDidLoad. Sinon, une séquence est exécutée sur le contrôleur de vue souhaité. Cela fonctionne parfaitement dans iOS 6.1 et au-dessus. Je suis sûr que cela fonctionne sur les versions antérieures d'iOS.






Related