définir le contrôleur de vue initial dans appdelegate - swift


147

Je voudrais définir le viewcontroller initial à partir de l'appdelegate. J'ai trouvé une très bonne réponse, mais c'est dans l'Objectif C et j'ai du mal à réaliser la même chose rapidement.

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

- (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;
}

Quelqu'un peut-il aider?

Je veux que le Viewcontroller initial dépende de certaines conditions remplies à l'aide d'une instruction conditionnelle.


Ceci est un doublon possible de: stackoverflow.com/questions/10428629/…
Honey

Réponses:


279

J'ai utilisé ce fil pour m'aider à convertir l'objectif C en rapide, et cela fonctionne parfaitement.

Instancier et présenter un viewController dans Swift

Code Swift 2 :

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    self.window = UIWindow(frame: UIScreen.mainScreen().bounds)

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

    let initialViewController = storyboard.instantiateViewControllerWithIdentifier("LoginSignupVC")

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

    return true
}

Code Swift 3 :

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

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

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

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

    return true
}

1
impossible de trouver le storyboard "Main", ni "Storyboard.storyboard" dans l'application swift 2
Async-

5
Est-ce la manière standard actuelle de définir le contrôleur de vue initial dans appdelegate ? Je demande parce que cela ressemble à un petit hack (désolé @Abs).
rigdonmr

10
@rigdonmr Si l'application a un storyboard défini comme interface principale, la fenêtre est chargée automatiquement et son contrôleur de vue racine est défini sur le contrôleur de vue initial du storyboard. Si le contrôleur de vue doit changer en fonction d'une condition ou si l'application n'a pas d'interface principale, il est acceptable d'initialiser un UIWindowet de définir son contrôleur de vue racine par programme.
JAL

2
La chose surprenante (mais bonne) ici est que l'instanciation manuelle du contrôleur de vue de cette manière semble empêcher iOS d'instancier le contrôleur de vue par défaut. J'aurais pu m'attendre à ce que les deux soient chargés. Ce comportement est-il documenté quelque part?
Pat Niemeyer le

2
@MayankJain cela fonctionne bien avec Swift 3, il suffit de traduire une partie du code de swift précédent
JAB

42

Essaye ça. Par exemple: vous devez utiliser UINavigationControllercomme contrôleur de vue initial. Ensuite, vous pouvez définir n'importe quel contrôleur de vue en tant que racine à partir du storyboard.

 func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    // Override point for customization after application launch.
    let storyboard:UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
    let navigationController:UINavigationController = storyboard.instantiateInitialViewController() as UINavigationController
    let rootViewController:UIViewController = storyboard.instantiateViewControllerWithIdentifier("VC") as UIViewController
    navigationController.viewControllers = [rootViewController]
    self.window?.rootViewController = navigationController
    return true
}

Voir mon écran de storyboard.


Avez-vous défini l'ID du storyboard pour votre contrôleur de vue dans le storyboard? Voir joxi.ru/l2ZYxZqS8JOomJ
protikhonoff

Oui, déjà défini, je pense que cela ouvre avec succès les contrôleurs de vue, mais cela ne le «montre» pas. Des idées?
Abubakar Moallim

Aucune erreur, après le lancement de l'écran, j'obtiens une page noire
Abubakar Moallim

Je suppose que j'ai trouvé le problème. Vous devriez cocher "Est le contrôleur de vue initial" dans votre storyboard. joxi.ru/8AnNbQlhq3QOAO
protikhonoff

mais je veux changer le viewcontroller initial en utilisant une instruction conditionnelle.
Abubakar Moallim

24

Pour Swift 3, Swift 4:

Instanciez le contrôleur de vue racine à partir du storyboard:

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

        // In project directory storyboard looks like Main.storyboard,
        // you should use only part before ".storyboard" as it's name,
        // so in this example name is "Main".
        let storyboard = UIStoryboard.init(name: "Main", bundle: nil)

        // controller identifier sets up in storyboard utilities
        // panel (on the right), it called Storyboard ID
        let viewController = storyboard.instantiateViewController(withIdentifier: "YourViewControllerIdentifier") as! YourViewController

        self.window?.rootViewController = viewController
        self.window?.makeKeyAndVisible()        
        return true
    }

Si vous souhaitez utiliser en UINavigationControllertant que root:

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

        let storyboard = UIStoryboard.init(name: "Main", bundle: nil)
        let viewController = storyboard.instantiateViewController(withIdentifier: "YourViewControllerIdentifier") as! YourViewController
        let navigationController = UINavigationController.init(rootViewController: viewController)
        self.window?.rootViewController = navigationController

        self.window?.makeKeyAndVisible()        
        return true
    }

Instanciez le contrôleur de vue racine à partir de xib:

C'est presque la même chose, mais au lieu de lignes

let storyboard = UIStoryboard.init(name: "Main", bundle: nil)
let viewController = storyboard.instantiateViewController(withIdentifier: "YourViewControllerIdentifier") as! YourViewController

tu devras écrire

let viewController = YourViewController(nibName: "YourViewController", bundle: nil)

22

si vous n'utilisez pas de storyboard, vous pouvez essayer ceci

var window: UIWindow?
var initialViewController :UIViewController?

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

    initialViewController  = MainViewController(nibName:"MainViewController",bundle:nil)

    let frame = UIScreen.mainScreen().bounds
    window = UIWindow(frame: frame)

    window!.rootViewController = initialViewController
    window!.makeKeyAndVisible()

    return true
}

1
à quoi fait référence le nom de la plume?
Abubakar Moallim

@Abs nibName est le nom de la pointe à charger pour instancier la vue.
rashii

Les animations de transition d'orientation cessent de fonctionner avec cela.
user3427013

J'ai déjà voté pour ce lol ... "je dois ouvrir la fenêtre puis définir son cadre, je dois ouvrir la fenêtre puis définir son cadre, je dois ouvrir la fenêtre puis définir son cadre" -moi à moi
Chris Allinson

18

Pour les nouveaux Xcode 11.xxx et Swift 5.xx, où la cible est définie sur iOS 13+.

Pour la nouvelle structure de projet, AppDelegate n'a rien à faire concernant rootViewController.

Une nouvelle classe est là pour gérer la classe window (UIWindowScene) -> fichier 'SceneDelegate'.

class SceneDelegate: UIResponder, UIWindowSceneDelegate {
var window: UIWindow?

func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {

    if let windowScene = scene as? UIWindowScene {
        let window = UIWindow(windowScene: windowScene)
        window.rootViewController = // Your RootViewController in here
        self.window = window
        window.makeKeyAndVisible()
    }

}

1
Très apprécié.
Azim Talukdar

14

Voici une bonne façon de l'aborder. Cet exemple place un contrôleur de navigation en tant que contrôleur de vue racine et place le contrôleur de vue de votre choix au bas de la pile de navigation, prêt à être poussé à partir de celui-ci.

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool
{
    // mainStoryboard
    let mainStoryboard = UIStoryboard(name: "MainStoryboard", bundle: nil)

    // rootViewController
    let rootViewController = mainStoryboard.instantiateViewControllerWithIdentifier("MainViewController") as? UIViewController

    // navigationController
    let navigationController = UINavigationController(rootViewController: rootViewController!)

    navigationController.navigationBarHidden = true // or not, your choice.

    // self.window
    self.window = UIWindow(frame: UIScreen.mainScreen().bounds)

    self.window!.rootViewController = navigationController

    self.window!.makeKeyAndVisible()
}

Pour que cet exemple fonctionne, vous définiriez "MainViewController" comme ID de Storyboard sur votre contrôleur de vue principal, et le nom de fichier du storyboard dans ce cas serait "MainStoryboard.storyboard". Je renomme mes storyboards de cette façon parce que Main.storyboard pour moi n'est pas un nom propre, en particulier si jamais vous allez le sous-classer.


11

je l'avais fait sur objectif-c j'espère que ce sera utile pour vous

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

UIViewController *viewController;

NSUserDefaults *loginUserDefaults = [NSUserDefaults standardUserDefaults];
NSString *check=[loginUserDefaults objectForKey:@"Checklog"];

if ([check isEqualToString:@"login"]) {

    viewController = [storyboard instantiateViewControllerWithIdentifier:@"SWRevealViewController"];
} else {

    viewController = [storyboard instantiateViewControllerWithIdentifier:@"LoginViewController"];
}


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

Comment avez-vous conçu les contrôleurs de vue dans le storyboard.Veuillez aider.
Poonam

faites glisser les contrôleurs de vue et définissez l'ID du storyboard de l'identité: <ViewControllerName> et accédez à votre contrôleur de vue ...
Patel Jigar

@PatelJigar comment définir dans loginvc
Uma Madhavi

appeler le contrôleur de vue comme celui-ci UITabBarController * tbc = [self.storyboard instantiateViewControllerWithIdentifier: @ "ContentViewController"]; [self presentViewController: tbc animé: OUI achèvement: nul];
Patel Jigar du

7

Code pour code Swift 4.2 et 5:

var window: UIWindow?


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

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

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

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

Et pour Xcode 11+ and for Swift 5+:

class SceneDelegate: UIResponder, UIWindowSceneDelegate {

     var window: UIWindow?

     func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
         if let windowScene = scene as? UIWindowScene {
             let window = UIWindow(windowScene: windowScene)

              window.rootViewController = // Your RootViewController in here

              self.window = window
              window.makeKeyAndVisible()
         }
    }
}

self.window donne une erreur La valeur de type 'AppDelegate' n'a pas de membre 'window', des idées?
Joseph Astrahan le

@JosephAstrahan déclare une variable avant de l'appeler. Comme - var window: UIWindow?.
Jamil Hasnine Tamim le

@JosephAstrahan vérifie à nouveau ma réponse. J'ai ajouté une variable.
Jamil Hasnine Tamim le

Merci, cela aide une tonne!
Joseph Astrahan le

And for Xcode 11+ and for Swift 5+une partie m'aide beaucoup. merci l'homme
Torongo

6

Je l'avais fait dans Xcode 8 et Swift 3.0, j'espère que cela vous sera utile et que cela fonctionne parfaitement. Utilisez le code suivant:

var window: UIWindow?

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

Et si vous utilisez le contrôleur de navigation, utilisez le code suivant pour cela:

var window: UIWindow?

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    self.window = UIWindow(frame: UIScreen.main.bounds)
    let storyboard = UIStoryboard(name: "Main", bundle: nil)
    let navigationController:UINavigationController = storyboard.instantiateInitialViewController() as! UINavigationController
    let initialViewController = storyboard.instantiateViewControllerWithIdentifier("ViewController")
    navigationController.viewControllers = [initialViewController]
    self.window?.rootViewController = navigationController
    self.window?.makeKeyAndVisible()      
    return true
}

Salut ... Mayank, j'avais fait dans Xcode 8 et swift 3.0 Quelle erreur vient après avoir utilisé cette solution car elle fonctionne
Kunal

6

Swift 4:

Ajoutez ces lignes dans AppDelegate.swift, dans la fonction didFinishLaunchingWithOptions () ...

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

    // Setting the Appropriate initialViewController

    // Set the window to the dimensions of the device
    self.window = UIWindow(frame: UIScreen.main.bounds)

    // Grab a reference to whichever storyboard you have the ViewController within
    let storyboard = UIStoryboard(name: "Name of Storyboard", bundle: nil)

    // Grab a reference to the ViewController you want to show 1st.
    let initialViewController = storyboard.instantiateViewController(withIdentifier: "Name of ViewController")

    // Set that ViewController as the rootViewController
    self.window?.rootViewController = initialViewController

    // Sets our window up in front
    self.window?.makeKeyAndVisible()

    return true
}

Maintenant, par exemple, nous faisons souvent quelque chose comme ça lorsque nous voulons soit conduire l'utilisateur à un écran de connexion ou à un écran de configuration initiale, soit revenir à l'écran principal de l'application, etc. Si vous voulez faire quelque chose comme ça aussi , vous pouvez utiliser ce point comme un embranchement pour cela.

Pensez-y. Vous pourriez avoir une valeur stockée dans NSUserDefaults par exemple qui contenait un booléen userLoggedIn etif userLoggedIn == false { use this storyboard & initialViewController... } else { use this storyboard & initialViewController... }


cela ne fonctionne pas dans un nouveau projet avec 1 ViewController ajouté. Commence toujours à partir du contrôleur de vue initial. Xcode 11.2 Où peut être un problème?
Oleh H

5

Eh bien, toutes les réponses ci-dessus / ci-dessous produisent un avertissement concernant l'absence de point d'entrée dans le storyboard.

Si vous voulez avoir 2 (ou plus) contrôleurs de vue d'entrée qui dépendent d'une condition (par exemple, conditionVariable ), alors ce que vous devez faire est:

  • Dans votre Main.storyboard, créez UINavigationController sans rootViewController, définissez-le comme point d'entrée
  • Créez 2 (ou plus) "Show" segues dans les contrôleurs de vue, attribuez-leur un identifiant, disons id1 et id2
  • Utilisez le code suivant:

    class AppDelegate: UIResponder, UIApplicationDelegate {
    
       var window: UIWindow?
    
       func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
           let navigationController = window!.rootViewController! as! UINavigationController
           navigationController.performSegueWithIdentifier(conditionVariable ? "id1" : "id2")
    
           return true
       }

J'espère que cela t'aides.


1
l'erreur "pas de point d'entrée dans le storyboard" est due à une configuration de projet qui peut être supprimée. allez dans projet> info> propriétés personnalisées de la cible iOS et supprimez la propriété "Nom de base du fichier storyboard principal". L'avertissement ne devrait plus apparaître.
orangemako

5

Si vous n'utilisez pas le storyboard. Vous pouvez initialiser votre contrôleur de vue principale par programme.

Swift 4

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

    let rootViewController = MainViewController()
    let navigationController = UINavigationController(rootViewController: rootViewController)
    self.window = UIWindow(frame: UIScreen.main.bounds)
    self.window?.rootViewController = navigationController
    self.window?.makeKeyAndVisible()

    return true
}
class MainViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        view.backgroundColor = .green
    }
}

Et également supprimer Maindes informations de déploiement .

entrez la description de l'image ici


Cela a fonctionné avec moi dans Swift 4.2, XCode 11.3, IOS 9 ~ 13.3.1
Codeur ACJHP

4

Voici la solution complète dans Swift 4 implémentez ceci dans didFinishLaunchingWithOptions

 func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

 let isLogin = UserDefaults.standard.bool(forKey: "Islogin")
    if isLogin{
        self.NextViewController(storybordid: "OtherViewController")


    }else{
        self.NextViewController(storybordid: "LoginViewController")

    }
}

écrivez cette fonction n'importe où dans Appdelegate.swift

  func NextViewController(storybordid:String)
{

    let storyBoard:UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
    let exampleVC = storyBoard.instantiateViewController(withIdentifier:storybordid )
   // self.present(exampleVC, animated: true)
    self.window = UIWindow(frame: UIScreen.main.bounds)
    self.window?.rootViewController = exampleVC
    self.window?.makeKeyAndVisible()
}

3

Juste au cas où vous voudriez le faire dans le contrôleur de vue et non dans le délégué d'application: récupérez simplement la référence à l'AppDelegate dans votre contrôleur de vue et réinitialisez son objet de fenêtre avec le contrôleur de vue droit car c'est rootviewController.

let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
appDelegate.window = UIWindow(frame: UIScreen.mainScreen().bounds)
let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
let yourVC = mainStoryboard.instantiateViewControllerWithIdentifier("YOUR_VC_IDENTIFIER") as! YourViewController
appDelegate.window?.rootViewController = yourVC
appDelegate.window?.makeKeyAndVisible()

3

Pour Swift 4.0 .

Dans votre fichier AppDelegate.swift dans la méthode didfinishedlaunchingWithOptions , placez le code suivant.

var window: UIWindow?


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

    let rootVC = MainViewController() // your custom viewController. You can instantiate using nib too. UIViewController(nib name, bundle)
    //let rootVC = UIViewController(nibName: "MainViewController", bundle: nil) //or MainViewController()
    let navController = UINavigationController(rootViewController: rootVC) // Integrate navigation controller programmatically if you want

    window?.rootViewController = navController

    return true
}

J'espère que cela fonctionnera très bien.


3
Si vous n'avez pas défini viewController initial dans stroyboard, vous devez ajouter window = UIWindow (frame: UIScreen.main.bounds)
Punit le

3

Swift 5 et Xcode 11

Ainsi, dans xCode 11, la solution de fenêtre n'est plus valide à l'intérieur de appDelegate. Ils l'ont déplacé vers SceneDelgate. Vous pouvez le trouver dans le fichier SceneDelgate.swift.

Vous remarquerez qu'il a maintenant un var window: UIWindow?cadeau.

Dans ma situation, j'utilisais un TabBarController à partir d'un storyboard et je voulais le définir comme rootViewController.

Voici mon code:

sceneDelegate.swift

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).

        self.window = self.window ?? UIWindow()//@JA- If this scene's self.window is nil then set a new UIWindow object to it.

        //@Grab the storyboard and ensure that the tab bar controller is reinstantiated with the details below.
        let storyboard = UIStoryboard(name: "Main", bundle: nil)
        let tabBarController = storyboard.instantiateViewController(withIdentifier: "tabBarController") as! UITabBarController

        for child in tabBarController.viewControllers ?? [] {
            if let top = child as? StateControllerProtocol {
                print("State Controller Passed To:")
                print(child.title!)
                top.setState(state: stateController)
            }
        }

        self.window!.rootViewController = tabBarController //Set the rootViewController to our modified version with the StateController instances
        self.window!.makeKeyAndVisible()

        print("Finished scene setting code")
        guard let _ = (scene as? UIWindowScene) else { return }
    }

Assurez-vous d'ajouter ceci à la méthode de scène correcte comme je l'ai fait ici. Notez que vous devrez définir le nom d'identifiant du tabBarController ou du viewController que vous utilisez dans le storyboard.

comment définir l'ID du storyboard

Dans mon cas, je faisais cela pour définir un stateController pour garder une trace des variables partagées parmi les vues d'onglets. Si vous souhaitez faire la même chose, ajoutez le code suivant ...

StateController.swift

import Foundation

struct tdfvars{
    var rbe:Double = 1.4
    var t1half:Double = 1.5
    var alphaBetaLate:Double = 3.0
    var alphaBetaAcute:Double = 10.0
    var totalDose:Double = 6000.00
    var dosePerFraction:Double = 200.0
    var numOfFractions:Double = 30
    var totalTime:Double = 168
    var ldrDose:Double = 8500.0
}

//@JA - Protocol that view controllers should have that defines that it should have a function to setState
protocol StateControllerProtocol {
  func setState(state: StateController)
}

class StateController {
    var tdfvariables:tdfvars = tdfvars()
}

Remarque: utilisez simplement vos propres variables ou tout ce que vous essayez de suivre à la place, je viens de lister les miennes comme exemple dans tdfvariables struct.

Dans chaque vue de TabController, ajoutez la variable membre suivante.

    class SettingsViewController: UIViewController {
    var stateController: StateController?
.... }

Ensuite, dans ces mêmes fichiers, ajoutez ce qui suit:

extension SettingsViewController: StateControllerProtocol {
  func setState(state: StateController) {
    self.stateController = state
  }
}

Cela vous permet d'éviter l'approche singleton pour passer des variables entre les vues. Cela permet facilement le modèle d'injection de dépendances qui est bien meilleur à long terme que l'approche singleton.


3

Désactiver Main.storyboard

General -> Deployment Info -> Main Interface -> remove `Main` 
Info.plist -> remove Key/Value for `UISceneStoryboardFile` and  `UIMainStoryboardFile`

Ajouter un identifiant de storyboard

Main.storyboard -> Select View Controller -> Inspectors -> Identity inspector -> Storyboard ID -> e.g. customVCStoryboardId

Swift 5 et Xcode 11

Étendre UIWindow

class CustomWindow : UIWindow {
    //...
}

Edit généré par Xcode SceneDelegate.swift

class SceneDelegate: UIResponder, UIWindowSceneDelegate {

    var window: CustomWindow!

    func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {

        guard let windowScene = (scene as? UIWindowScene) else { return }

        let storyboard = UIStoryboard(name: "Main", bundle: nil)
        let initialViewController = storyboard.instantiateViewController(withIdentifier: "customVCStoryboardId")

        window = CustomWindow(windowScene: windowScene)
        window.rootViewController = initialViewController
        window.makeKeyAndVisible()
    }

    //...
}

Peut définir le contrôleur racine sur le contrôleur de vue initial window.rootViewController = UIStoryboard (nom: "Main", bundle: nil) .instantiateInitialViewController ()
Kamran Khan

1
I worked out a solution on Xcode 6.4 in swift. 

// I saved the credentials on a click event to phone memory

    @IBAction func gotobidderpage(sender: AnyObject) {
 if (usernamestring == "bidder" && passwordstring == "day303")
        {
            rolltype = "1"

NSUserDefaults.standardUserDefaults().setObject(usernamestring, forKey: "username")
NSUserDefaults.standardUserDefaults().setObject(passwordstring, forKey: "password")
NSUserDefaults.standardUserDefaults().setObject(rolltype, forKey: "roll")


            self.performSegueWithIdentifier("seguetobidderpage", sender: self)
}


// Retained saved credentials in app delegate.swift and performed navigation after condition check


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

let usernamestring = NSUserDefaults.standardUserDefaults().stringForKey("username")
let passwordstring = NSUserDefaults.standardUserDefaults().stringForKey("password")
let rolltypestring = NSUserDefaults.standardUserDefaults().stringForKey("roll")

        if (usernamestring == "bidder" && passwordstring == "day303" && rolltypestring == "1")
        {

            // Access the storyboard and fetch an instance of the view controller
            var storyboard = UIStoryboard(name: "Main", bundle: nil)
            var viewController: BidderPage = storyboard.instantiateViewControllerWithIdentifier("bidderpageID") as! BidderPage

            // Then push that view controller onto the navigation stack
            var rootViewController = self.window!.rootViewController as! UINavigationController
            rootViewController.pushViewController(viewController, animated: true)
        }

        // Override point for customization after application launch.
        return true
    }



Hope it helps !

1
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
}

1

Ouvrez un viewcontroller avec SWRevealViewController From App délégué.

 self.window = UIWindow(frame: UIScreen.main.bounds)
 let storyboard = UIStoryboard(name: "StoryboardName", bundle: nil)
 let swrevealviewcontroller:SWRevealViewController = storyboard.instantiateInitialViewController() as! SWRevealViewController 
 self.window?.rootViewController = swrevealviewcontroller
 self.window?.makeKeyAndVisible()

0

Pour Swift 5+


var window: UIWindow?

    func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
        if let windowScene = scene as? UIWindowScene {
            let window = UIWindow(windowScene: windowScene)
            let submodules = (
                home: HomeRouter.createModule(),
                search: SearchRouter.createModule(),
                exoplanets: ExoplanetsRouter.createModule()
            )
            
            let tabBarController = TabBarModuleBuilder.build(usingSubmodules: submodules)
            
            window.rootViewController = tabBarController
            self.window = window
            window.makeKeyAndVisible()
        }
    }
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.