imposta il viewcontroller iniziale in appdelegate - swift


147

Vorrei impostare il viewcontroller iniziale dal delegato dell'app. Ho trovato una risposta davvero buona, tuttavia è nell'Obiettivo C e ho problemi a raggiungere la stessa cosa in breve tempo.

Impostare a livello di programmazione il controller di visualizzazione iniziale utilizzando Storyboard

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

Qualcuno in grado di aiutare?

Voglio che il Viewcontroller iniziale dipenda dal fatto che determinate condizioni vengano soddisfatte usando un'istruzione condizionale.


Questo è un possibile duplicato di: stackoverflow.com/questions/10428629/…
Miele

Risposte:


279

Ho usato questo thread per aiutarmi a convertire l'obiettivo C in rapido, e funziona perfettamente.

Crea un'istanza e presenta un viewController in Swift

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

Codice 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
non è possibile trovare lo storyboard "Principale", né "Storyboard.storyboard" nell'app
Swift

5
È questo l'attuale metodo standard per impostare il controller della vista iniziale in Appdelegate ? Lo chiedo perché sembra un po 'piccolo di un trucco (scusate @Abs).
rigdonmr,

10
@rigdonmr Se l'applicazione ha uno Storyboard impostato come interfaccia principale, la finestra viene caricata automaticamente e il suo controller della vista principale è impostato sul controller della vista iniziale dello storyboard. Se il controller di visualizzazione deve cambiare in base a una condizione o l'applicazione non ha un'interfaccia principale, è accettabile inizializzare a UIWindowe impostare il controller di visualizzazione radice in modo programmatico.
JAL

2
La cosa sorprendente (ma buona) qui è che l'istanza manuale del controller di visualizzazione in questo modo sembra impedire a iOS di creare un'istanza del controller di visualizzazione predefinito. Mi sarei aspettato che fossero caricati entrambi. Questo comportamento è documentato da qualche parte?
Pat Niemeyer,

2
@MayankJain funziona bene con Swift 3, ho solo bisogno di tradurre parte del codice di swift precedente
JAB

42

Prova questo. Ad esempio: è necessario utilizzare UINavigationControllercome controller della vista iniziale. Quindi, puoi impostare qualsiasi controller di visualizzazione come root dallo 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
}

Guarda la schermata del mio storyboard.


Hai impostato l'ID storyboard per il controller di visualizzazione nello storyboard? Vedi joxi.ru/l2ZYxZqS8JOomJ
protikhonoff

Già già impostato, penso che stia aprendo con successo i controller di visualizzazione, ma non lo sta "mostrando". Qualche idea?
Abubakar Moallim,

Nessun errore, dopo il lancio dello schermo, ottengo una pagina nera
Abubakar Moallim,

Immagino di aver trovato il problema. È necessario selezionare "Is Initial View Controller" nello storyboard. joxi.ru/8AnNbQlhq3QOAO
protikhonoff

ma voglio cambiare il viewcontroller iniziale usando un'istruzione condizionale.
Abubakar Moallim,

24

Per Swift 3, Swift 4:

Crea un'istanza del controller di visualizzazione radice dallo 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
    }

Se si desidera utilizzare UINavigationControllercome 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
    }

Crea un'istanza del controller di visualizzazione radice da xib:

È quasi lo stesso, ma al posto delle linee

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

dovrai scrivere

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

22

se non stai utilizzando lo storyboard, puoi provare questo

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
a cosa si riferisce il nome del pennino?
Abubakar Moallim,

@Abs nibName è il nome del pennino da caricare per creare un'istanza della vista.
rashii,

Le animazioni di transizione di orientamento smettono di funzionare con questo.
user3427013,

Ho già votato a favore di questo lol ... "Devo inizializzare la finestra, quindi impostare la cornice, devo inizializzare la finestra, quindi impostare la cornice, devo inizializzare la finestra, quindi impostare la cornice" -me a me stesso
Chris Allinson,

18

Per i nuovi Xcode 11.xxx e Swift 5.xx, dove il target è impostato su iOS 13+.

Per la nuova struttura del progetto, AppDelegate non deve fare nulla per quanto riguarda rootViewController.

Una nuova classe è lì per gestire la classe window (UIWindowScene) -> file '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
Molto apprezzato.
Azim Talukdar,

14

Ecco un buon modo per affrontarlo. Questo esempio posiziona un controller di navigazione come controller di visualizzazione radice e inserisce il controller di visualizzazione di tua scelta nella parte inferiore dello stack di navigazione, pronto per farti spingere da ciò che ti serve.

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

Per far funzionare questo esempio, devi impostare "MainViewController" come ID Storyboard sul controller della vista principale, e il nome del file dello storyboard in questo caso sarà "MainStoryboard.storyboard". Rinomino i miei storyboard in questo modo perché Main.storyboard per me non è un nome proprio, in particolare se si va in sottoclasse.


11

l'ho fatto con obiettivo-c spero che ti sarà utile

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];

Come hai progettato i controller di visualizzazione nello storyboard.
Poonam,

trascina i controller di visualizzazione e imposta l'ID storyboard identità: <ViewControllerName> e accedi al controller di visualizzazione ...
Patel Jigar

@PatelJigar come impostare in loginvc
Uma Madhavi il

chiama il controller di visualizzazione come questo UITabBarController * tbc = [self.storyboard instantiateViewControllerWithIdentifier: @ "ContentViewController"]; [self presentViewController: tbc animato: SÌ completamento: zero];
Patel Jigar,

7

Codice per i codici Swift 4.2 e 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()
}

E per 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 dà errore Il valore del tipo 'AppDelegate' non ha membri 'window', qualche idea?
Joseph Astrahan,

@JosephAstrahan dichiara una variabile prima di chiamarla. Mi piace - var window: UIWindow?.
Jamil Hasnine Tamim,

@JosephAstrahan controlla di nuovo la mia risposta. Ho aggiunto una variabile.
Jamil Hasnine Tamim,

Grazie, aiuta molto!
Joseph Astrahan,

And for Xcode 11+ and for Swift 5+la parte mi aiuta molto. grazie amico
Torongo

6

In Xcode 8 e swift 3.0 l'avevo fatto, spero che ti sarà utile e che funzioni perfettamente. Usa il seguente codice:

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
}

E se si utilizza il controller di navigazione, utilizzare il seguente codice per quello:

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
}

Ciao ... Mayank, avevo fatto in Xcode 8 e swift 3.0 Quale errore viene dopo aver usato questa soluzione perché funziona
Kunal

6

Swift 4:

Aggiungi queste righe all'interno di AppDelegate.swift, all'interno della funzione 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
}

Ora, ad esempio, molte volte facciamo qualcosa del genere quando vogliamo guidare l'utente verso una schermata di accesso o una schermata di configurazione iniziale o tornare alla schermata principale dell'app, ecc. Se vuoi fare anche una cosa del genere , puoi usare questo punto come fork-in-the-road per quello.

Pensaci. Potresti avere un valore archiviato in NSUserDefaults, ad esempio, che conteneva un utenteLoggedIn Boolean eif userLoggedIn == false { use this storyboard & initialViewController... } else { use this storyboard & initialViewController... }


non funziona in un nuovo progetto con 1 ViewController aggiunto. Inizia sempre dal controller della vista iniziale. Xcode 11.2 Dove può esserci un problema?
Oleh H del

5

Bene, tutte le risposte sopra / sotto stanno producendo un avvertimento su nessun punto di ingresso nello storyboard.

Se vuoi avere 2 (o più) controller per la visualizzazione delle voci che dipendono da una condizione (ad esempio conditionVariable ), allora cosa dovresti fare è:

  • Nel tuo Main.storyboard crea UINavigationController senza rootViewController, impostalo come punto di ingresso
  • Crea 2 (o più) segui "Show" nei controller di visualizzazione, assegna loro un id, dì id1 e id2
  • Usa il prossimo codice:

    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
       }

Spero che questo ti aiuti.


1
l'errore "nessun punto di ingresso nello storyboard" è dovuto a una configurazione del progetto che può essere eliminata. vai su progetto> info> proprietà target iOS personalizzate ed elimina la proprietà "Nome base file storyboard principale". L'avviso non dovrebbe più apparire.
Orangemako,

5

Se non stai utilizzando lo storyboard. È possibile inizializzare il controller della vista principale a livello di codice.

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

Inoltre rimuovi Maindalle Informazioni sulla distribuzione .

inserisci qui la descrizione dell'immagine


Questo ha funzionato con me in Swift 4.2, XCode 11.3, IOS 9 ~ 13.3.1
Coder ACJHP

4

Ecco la soluzione completa in Swift 4 implementala in 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")

    }
}

scrivere questa funzione in qualsiasi punto all'interno di 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

Nel caso in cui si desideri farlo nel controller di visualizzazione e non nel delegato dell'app: è sufficiente recuperare il riferimento a AppDelegate nel controller di visualizzazione e reimpostare l'oggetto finestra con il controller di visualizzazione corretto in quanto 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

Per swift 4.0 .

Nel tuo file AppDelegate.swift nel metodo didfinishedlaunchingWithOptions , inserisci il codice seguente.

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
}

Spero che funzioni bene.


3
Ha funzionato .. Se non hai impostato viewController iniziale in stroyboard, devi aggiungere window = UIWindow (frame: UIScreen.main.bounds)
Punit

3

Swift 5 e Xcode 11

Quindi in xCode 11 la soluzione per finestre non è più valida all'interno di appDelegate. Lo hanno spostato su SceneDelgate. Puoi trovarlo nel file SceneDelgate.swift.

Noterai che ora ha un var window: UIWindow?regalo.

Nella mia situazione stavo usando un TabBarController da uno storyboard e volevo impostarlo come rootViewController.

Questo è il mio codice:

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

Assicurati di aggiungere questo al metodo di scena corretto come ho fatto qui. Tieni presente che dovrai impostare il nome identificativo per tabBarController o viewController che stai utilizzando nello storyboard.

come impostare l'ID dello storyboard

Nel mio caso lo stavo facendo per impostare un stateController per tenere traccia delle variabili condivise tra le visualizzazioni delle schede. Se desideri fare la stessa cosa aggiungi il seguente codice ...

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

Nota: usa semplicemente le tue variabili o qualunque cosa tu stia cercando di tenere traccia, invece, ho elencato le mie come esempio in struct tdfvariables.

In ciascuna vista di TabController aggiungere la seguente variabile membro.

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

Quindi in quegli stessi file aggiungere quanto segue:

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

Ciò consente di evitare l'approccio singleton al passaggio di variabili tra le viste. Ciò consente facilmente il modello di iniezione delle dipendenze che è molto meglio a lungo termine rispetto all'approccio singleton.


3

disattivare Main.storyboard

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

Aggiungi ID storyboard

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

Swift 5 e Xcode 11

Estendere UIWindow

class CustomWindow : UIWindow {
    //...
}

Modifica generata da 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()
    }

    //...
}

Può impostare il controller di root sul controller della vista iniziale window.rootViewController = UIStoryboard (nome: "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

Apri un viewcontroller con SWRevealViewController dal delegato dell'app.

 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

Per 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()
        }
    }
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.