Définir par programme le contrôleur de vue initial à l'aide de Storyboards

252

Comment définir par programme le InitialViewControllerpour un Storyboard? Je veux ouvrir mon storyboard à une vue différente en fonction de certaines conditions qui peuvent varier d'un lancement à l'autre.

UserDev
la source
1
Vérifiez cette réponse sans avertissement, sans effacer le storyboard principal dans les paramètres.
Borzh

Réponses:

466

Comment sans 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 votre propriété de fenêtre dans le délégué d'application est désormais nulle.

Dans le paramètre de l'application, accédez à votre cible et à l' Infoonglet. Là, la valeur de Main storyboard file base name. Sous l' Generalonglet, effacez la valeur de Main Interface. Cela supprimera l'avertissement.

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

- (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;
}
Travis
la source
7
L'amour! L'amour! L'amour! Je vais l'utiliser pour basculer entre deux arborescences de contrôleur de vue complètement différentes pour IOS6 et IOS7. Semble être le meilleur moyen de gérer la compatibilité descendante, tout en utilisant toutes les cloches et les sifflets dans IOS7.
Hunkpapa
6
J'apprends la programmation iOS dans Swift. Quelqu'un peut-il m'aider à écrire le code ci-dessus rapidement? veuillez aider. Merci.
Raghavendra
1
@bdv didFinishLaunchingWithOptionsest appelé lorsque l'application est lancée dans un nouveau processus. Si vous accédez à l'écran d'accueil et revenez à l'application, cette méthode ne sera plus invoquée. (À moins que iOS ne s'arrête en raison de contraintes de mémoire.) Essayez d'arrêter l'application et de la relancer à partir de votre IDE. Si le problème persiste, postez le problème à SO et je serai heureux de vous aider, ami.
Travis
2
@peyman Selon mon enquête, la fenêtre n'existe plus une fois la référence au storyboard principal supprimée. J'ai commenté l'instanciation de la fenêtre dans mon projet actuel et j'ai trouvé que c'était toujours le cas.
Travis
2
@Raghav, voici le code rapide:self.window = UIWindow(frame: UIScreen.mainScreen().bounds) var storyboard = UIStoryboard(name: "Main", bundle: nil) var viewController: UIViewController = // self.window!.rootViewController = viewController self.window!.makeKeyAndVisible()
mjmayank
121

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. Ensuite,

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 serait le nouveau contrôleur de vue initial que vous souhaitez afficher.

Les étapes expliquées:

  1. Créez une nouvelle fenêtre avec la taille de la fenêtre actuelle et définissez-la comme notre fenêtre principale
  2. Instancier un storyboard que nous pouvons utiliser pour créer notre nouveau contrôleur de vue initiale
  3. Instanciez notre nouveau contrôleur de vue initiale en fonction de son ID Storyboard
  4. Définissez le contrôleur de vue racine de notre nouvelle fenêtre comme notre nouveau contrôleur que nous venons de lancer
  5. Rendre notre nouvelle fenêtre visible

Profitez-en et bonne programmation!

Afficher un nom
la source
on m'a demandé @Travis pour cette version, puis .... Merci quand même.
dellos
L'ID du storyboard se trouve dans la section Identité du volet Inspecteur d'identité
Dominic
2
Une astuce pour ne pas avoir besoin de l'ID de storyboard consiste à définir explicitement le contrôleur de vue initial (rootViewController) dans le storyboard et à utiliser la méthode d'instance UIStoryboard.instantiateInitialViewController () pour obtenir le contrôleur au lieu de UIStoryboard.instantiateViewControllerWithIdentifier () proposé ci-dessus. Le reste est le même.
Eric Boumendil
45

Vous pouvez définir par programme 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;
}
Chengjiong
la source
Comment lancer ensuite le point d'entrée d'origine à partir du UIViewController secondaire?
ooxio
@ooxio: vous pouvez stocker le point d'entrée d'origine dans un emplacement global puis l'utiliser plus tard.
Chengjiong
c'est vraiment utile si vous voulez instancier pour vous connecter / vous enregistrer ou quelque chose comme ça ...
Honey
C'est tellement plus simple que la réponse de @ Travis ci-dessus, car vous n'avez pas à vous soucier d'un million de paramètres de projet et à bricoler dans IB. Qui se soucie si l'un de vos contrôleurs de vue est techniquement le VC initial par défaut et que vous vous dirigez par programme vers un autre?
Danny
Notez que le contrôleur de vue initial remplacé par le storyboard sera toujours instancié et passera par le cycle init()/ deinit(), mais sans exécuter viewDidLoad()ou initialiser correctement IBOutlet-s. Assurez-vous que votre code est prêt pour cela.
Gary
14

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
}
MEK
la source
Merci, @MEK. En outre, vous souhaiterez peut-être corriger la syntaxe des instructions de fermeture conditionnelles en remplaçant les parenthèses de fin par des accolades.
Native_Mobile_Arch_Dev
9

Vous pouvez définir Navigation rootviewcontroller comme contrôleur de vue principal. Cette idée peut être utilisée pour la connexion automatique selon les exigences de l'application.

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

UIViewController viewController = (HomeController*)[mainStoryboard instantiateViewControllerWithIdentifier: @"HomeController"];

UINavigationController navController = [[UINavigationController alloc] initWithRootViewController:viewController];

 self.window.rootViewController = navController;

if (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_6_1) {

    // do stuff for iOS 7 and newer

    navController.navigationBar.barTintColor = [UIColor colorWithRed:88/255.0 green:164/255.0 blue:73/255.0 alpha:1.0];

    navController.navigationItem.leftBarButtonItem.tintColor = [UIColor colorWithRed:88/255.0 green:164/255.0 blue:73/255.0 alpha:1.0];

    navController.navigationBar.tintColor = [UIColor whiteColor];

    navController.navigationItem.titleView.tintColor = [UIColor whiteColor];

    NSDictionary *titleAttributes =@{

                                     NSFontAttributeName :[UIFont fontWithName:@"Helvetica-Bold" size:14.0],

                                     NSForegroundColorAttributeName : [UIColor whiteColor]

                                     };

    navController.navigationBar.titleTextAttributes = titleAttributes;

    [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];

}

else {

    // do stuff for older versions than iOS 7

    navController.navigationBar.tintColor = [UIColor colorWithRed:88/255.0 green:164/255.0 blue:73/255.0 alpha:1.0];



    navController.navigationItem.titleView.tintColor = [UIColor whiteColor];

}

[self.window makeKeyAndVisible];

Pour les utilisateurs de StoryboardSegue

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

// Go to Login Screen of story board with Identifier name : LoginViewController_Identifier

LoginViewController *loginViewController = (LoginViewController*)[mainStoryboard instantiateViewControllerWithIdentifier:@“LoginViewController_Identifier”];

navigationController = [[UINavigationController alloc] initWithRootViewController:testViewController];

self.window.rootViewController = navigationController;

[self.window makeKeyAndVisible];

// Go To Main screen if you are already Logged In Just check your saving credential here

if([SavedpreferenceForLogin] > 0){
    [loginViewController performSegueWithIdentifier:@"mainview_action" sender:nil];
}

Merci

Bhavsar1311
la source
6

Ouvrez le tableau principal, sélectionnez d'abord la vue que vous souhaitez démarrer, puis ouvrez Utilitaires -> Attributs. Sous le "View Controller", vous voyez le bouton radio "Is initial View Controller". Sélectionnez-le.

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

Peut-être pouvez-vous essayer ceci: écrivez 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.

m.etka
la source
J'ai écrit la méthode dans le ViewDidLoad mais cela n'a pas fonctionné et quand je l'utilise dans le viewdidAppear, cela fonctionne, pouvez-vous expliquer pourquoi cela se produit.
UserDev
Peut-être devriez-vous essayer ceci: Ajoutez un code de séquence selon vos conditions à l'une des méthodes appropriées dans le fichier appDelegate.m. Par exemple, vous pouvez ajouter un code de séquence à la méthode "applicationDidBecomeActive:".
m.etka
@Jagdev vous l'écrivez dans ViewDidAppear au lieu de ViewDidLoad.
Umair Khan Jadoon
Le problème avec cette approche est que le contrôleur de vue initial apparaît devient visible pendant un certain temps, puis passe à un autre qui n'est pas bon du point de vue UX, donc ce n'est pas une bonne solution.
vishal dharankar
3

SWIFT 5

Si vous n'avez pas de ViewController défini comme ViewController initial dans le storyboard, vous devez faire 2 choses:

  1. Accédez à vos projets CIBLES, sélectionnez votre projet -> Général -> Effacez le champ Interface principale.
  2. Toujours à l'intérieur des CIBLES du projet, allez maintenant dans Info -> Manifeste de scène d'application -> Configuration de scène -> Rôle de session d'application -> Item0 (configuration par défaut) -> supprimez le champ de nom du storyboard.

Enfin, vous pouvez maintenant ajouter votre code dans SceneDelegate:

func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
    // Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`.
    // If using a storyboard, the `window` property will automatically be initialized and attached to the scene.
    // This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead).
    guard let windowScene = (scene as? UIWindowScene) else { return }

    window = UIWindow(windowScene: windowScene)


    let storyboard = UIStoryboard(name: "Main", bundle: nil)
    // Make sure you set an Storyboard ID for the view controller you want to instantiate
    window?.rootViewController = storyboard.instantiateViewController(withIdentifier: identifier)
    window?.makeKeyAndVisible()

}
rs7
la source
C'est certainement la réponse la plus récente en date de Xcode 11.5, et a en effet corrigé l' Failed to instantiate the default view controller for UIMainStoryboardFile 'Main' - perhaps the designated entry point is not setavertissement que j'avais après avoir décidé d'instancier mon VC initial dans le code. Un point important, lorsque @ rs7 dit "supprimer le champ du nom du storyboard", cela signifie toute la ligne du plist, pas seulement le contenu du champ lui-même.
cdf1982
2

Je ne pense pas que ce soit possible. Au lieu de cela, vous pouvez avoir un contrôleur initial qui aura des séquences vers différents contrôleurs de vue. Au démarrage, vous pouvez décider quelle séquence effectuer par programme.

Shmidt
la source
2

Vous pouvez définir à l' initial view controlleraide d'Interface Builder ainsi que par programme.

Ci-dessous, l'approche utilisée pour la programmation.

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
Jayprakash Dubey
la source
2

J'ai créé une classe de routage pour gérer la navigation dynamique et garder la classe AppDelegate propre, j'espère que cela aidera d'autres aussi.

//
//  Routing.swift
// 
//
//  Created by Varun Naharia on 02/02/17.
//  Copyright © 2017 TechNaharia. All rights reserved.
//

import Foundation
import UIKit
import CoreLocation

class Routing {

    class func decideInitialViewController(window:UIWindow){
        let userDefaults = UserDefaults.standard
        if((Routing.getUserDefault("isFirstRun")) == nil)
        {
            Routing.setAnimatedAsInitialViewContoller(window: window)
        }
        else if((userDefaults.object(forKey: "User")) != nil)
        {
            Routing.setHomeAsInitialViewContoller(window: window)
        }
        else
        {
            Routing.setLoginAsInitialViewContoller(window: window)
        }

    }

    class func setAnimatedAsInitialViewContoller(window:UIWindow) {
        Routing.setUserDefault("Yes", KeyToSave: "isFirstRun")
        let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
        let animatedViewController: AnimatedViewController = mainStoryboard.instantiateViewController(withIdentifier: "AnimatedViewController") as! AnimatedViewController

        window.rootViewController = animatedViewController
        window.makeKeyAndVisible()
    }

    class func setHomeAsInitialViewContoller(window:UIWindow) {
        let userDefaults = UserDefaults.standard
        let decoded  = userDefaults.object(forKey: "User") as! Data
        User.currentUser = NSKeyedUnarchiver.unarchiveObject(with: decoded) as! User

        if(User.currentUser.userId != nil && User.currentUser.userId != "")
        {
            let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
            let homeViewController: HomeViewController = mainStoryboard.instantiateViewController(withIdentifier: "HomeViewController") as! HomeViewController
            let loginViewController: UINavigationController = mainStoryboard.instantiateViewController(withIdentifier: "LoginNavigationViewController") as! UINavigationController
            loginViewController.viewControllers.append(homeViewController)
            window.rootViewController = loginViewController
        }
        window.makeKeyAndVisible()
    }

    class func setLoginAsInitialViewContoller(window:UIWindow) {
        let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
        let loginViewController: UINavigationController = mainStoryboard.instantiateViewController(withIdentifier: "LoginNavigationViewController") as! UINavigationController

        window.rootViewController = loginViewController
        window.makeKeyAndVisible()
    }

  class func setUserDefault(_ ObjectToSave : Any?  , KeyToSave : String)
    {
        let defaults = UserDefaults.standard

        if (ObjectToSave != nil)
        {

            defaults.set(ObjectToSave, forKey: KeyToSave)
        }

        UserDefaults.standard.synchronize()
    }

    class func getUserDefault(_ KeyToReturnValye : String) -> Any?
    {
        let defaults = UserDefaults.standard

        if let name = defaults.value(forKey: KeyToReturnValye)
        {
            return name as Any
        }
        return nil
    }

    class func removetUserDefault(_ KeyToRemove : String)
    {
        let defaults = UserDefaults.standard
        defaults.removeObject(forKey: KeyToRemove)
        UserDefaults.standard.synchronize()
    }

}

Et dans votre AppDelegate, appelez cela

 self.window = UIWindow(frame: UIScreen.main.bounds)
 Routing.decideInitialViewController(window: self.window!)
Varun Naharia
la source
2

Une autre solution avec l'utilisation de Swift 3 et Swift 4 pour éviter le lancer forcé 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
}
abdullahselek
la source
2

Dans, AppDelegate.swiftvous pouvez ajouter le code suivant:

let sb = UIStoryboard(name: "Main", bundle: nil)
let vc = sb.instantiateViewController(withIdentifier: "YourViewController_StorboardID")
self.window?.rootViewController = vc
self.window?.makeKeyAndVisible()

Bien sûr, vous devez implémenter votre logique, en fonction des critères que vous choisirez un contrôleur de vue approprié.

N'oubliez pas non plus d'ajouter une identité (sélectionnez storyboard -> Controller Scene -> Afficher l'inspecteur d'identité -> assigner StorboardID).

Nedim Talovic
la source
1

RÉPONSE MISE À JOUR pour iOS 13 et délégué de scène:

assurez-vous que dans votre fichier info.plist, allez dans Manifeste de scène d'application -> Configuration de scène -> Rôle de session d'application -> Élément 0 et supprimez également la référence au storyboard principal. Sinon, vous obtiendrez le même avertissement concernant l'échec de l'instanciation du storyboard.

Déplacez également le code du délégué d'application vers la scène de la méthode de délégué de scène (_: willConnectTo: options :), car c'est là que les événements du cycle de vie sont désormais traités.

bze12
la source
0

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 défini sur visible dans viewDidLoad. Sinon, une séquence est effectuée vers le contrôleur de vue souhaité. Cela fonctionne parfaitement dans iOS 6.1 et supérieur. Je suis sûr que cela fonctionne sur les versions antérieures d'iOS.

m.etka
la source
0

Merci d'avoir modifié cela comme suit dans AppDelegate:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) ->     Bool {
//Some code to check value of pins

if pins! == "Verified"{
        print(pins)
        self.window = UIWindow(frame: UIScreen.mainScreen().bounds)
        let mainStoryboard: UIStoryboard = UIStoryboard(name: "HomePage", bundle: nil)
        let exampleViewController: UINavigationController = mainStoryboard.instantiateViewControllerWithIdentifier("SBHP") as! UINavigationController

        self.window?.rootViewController = exampleViewController

        self.window?.makeKeyAndVisible()
    }else{
        print(pins)
        self.window = UIWindow(frame: UIScreen.mainScreen().bounds)
        let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
        let exampleViewController: UINavigationController = mainStoryboard.instantiateViewControllerWithIdentifier("SBUser") as! UINavigationController

        self.window?.rootViewController = exampleViewController

        self.window?.makeKeyAndVisible()
    }
Jeremy
la source
0

Solution simple trouvée - pas besoin de supprimer la "vérification initiale du contrôleur de vue" du storyboard et de modifier l'onglet Info du projet et de l'utiliser makeKeyAndVisible, il suffit de placer

self.window.rootViewController = rootVC;

dans

- (BOOL) application:didFinishLaunchingWithOptions:
alex1704
la source
Mais vous obtenez toujours rootVCde instantiateViewControllerWithIdentifier, correct?
thomers
0
let mainStoryboard = UIStoryboard(name: "Main", bundle: nil)
let vc = mainStoryboard.instantiateViewController(withIdentifier: "storyBoardid") as! ViewController
let navigationController = UINavigationController(rootViewController: vc)
UIApplication.shared.delegate.window?.rootViewController = navigationController

Une autre façon est de présenter viewController,

let mainStoryboard = UIStoryboard(name: "Main", bundle: nil)
let vc = mainStoryboard.instantiateViewController(withIdentifier: "storyBoardid") as! ViewController
self.present(vc,animated:true,completion:nil)

Vous devez d'abord créer un objet de votre storyboard, puis changer de racine (si nécessaire), puis vous prendrez la référence d'un contrôleur de vue particulier qui est poussé le contrôleur de vue actuel (si vous changez de racine) sinon c'est juste un nouveau contrôleur de vue qui peut vous

VD Purohit
la source
@VD Purohit, pouvez-vous décrire plus en détail votre réponse pour plus de compréhension.
Prags
0

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
}
Shan Ye
la source
0
 func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        self.window = UIWindow(frame: UIScreen.main.bounds)
        let storyboard = UIStoryboard(name: "Main", bundle: nil)
        if (PreferenceHelper.getAccessToken() != "") {
            let initialViewController = storyboard.instantiateViewController(withIdentifier: "your View Controller Identifier")
            self.window?.rootViewController = initialViewController
        } else {
            let initialViewController = storyboard.instantiateViewController(withIdentifier: "your View Controller identifier")
            self.window?.rootViewController = initialViewController
        }
        self.window?.makeKeyAndVisible()
        return true
    }

/*
use your view Controller identifier must use it doubles quotes**strong text**
Charles
la source
vérification sur nsuser Valeur par défaut valeur des préférences valeur Complètement stockée et vérification de la condition sur la vue initiale Problème de contrôleur
charles
0

Swift 5 ou supérieur # rend le contrôleur de vue d'itinéraire par ce code simple. Si vous utilisez xcode 11 ou supérieur, initialisez d'abord var window: UIWindow?dans AppDelegate

let rootVC = mainStoryboard.instantiateViewController(withIdentifier: "YOURCONTROLLER") as! YOURCONTROLLER

        navigationController.setNavigationBarHidden(true, animated: true)
        UIApplication.shared.windows.first?.rootViewController = UINavigationController.init(rootViewController: rootVC)
        UIApplication.shared.windows.first?.makeKeyAndVisible()
Rohit Nishad
la source
0

Si vous préférez ne pas modifier applicationDidFinish, vous pouvez effectuer l'astuce suivante:

Définissez le contrôleur de navigation comme contrôleur de vue initial et affectez-lui une classe personnalisée «MyNavigationController». Ensuite, vous pouvez modifier son contrôleur de vue racine pendant viewDidLoad - il remplacera le contrôleur de vue racine que vous avez défini dans votre storyboard.

class MyNavigationController: UINavigationController {
    override func viewDidLoad() {
        super.viewDidLoad()
        if !isLoggedIn() {
            viewControllers = [R.storyboard.authentication.loginView()!]
        }
    }

    private func isLoggedIn() -> Bool {
        return false
    }

}
Kamen Dobrev
la source
-3

Sélectionnez le contrôleur de vue que vous souhaitez ouvrir en premier et accédez à l'inspecteur d'attributs. Allez à la scène initiale et cochez l'option du contrôleur de vue initiale.

Maintenant, ce sera votre contrôleur de vue initial qui s'ouvrira en premier lors du lancement de l'application.

iMash
la source