establecer viewcontroller inicial en appdelegate - swift

147

Me gustaría establecer el viewcontroller inicial desde el appdelegate. Encontré una respuesta realmente buena, sin embargo, está en el Objetivo C y estoy teniendo problemas para lograr lo mismo de manera rápida.

Configure mediante programación el controlador de vista inicial usando 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;
}

Alguien capaz de ayudar?

Quiero que el Viewcontroller inicial dependa de que se cumplan ciertas condiciones mediante una declaración condicional.

Abubakar Moallim
fuente
Este es un posible duplicado de: stackoverflow.com/questions/10428629/…
Miel

Respuestas:

279

Usé este hilo para ayudarme a convertir el objetivo C en rápido, y funciona perfectamente.

Instanciar y presentar un viewController en Swift

Código 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
}

Código 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
}
Abubakar Moallim
fuente
1
no puede encontrar el guión gráfico "Principal" ni el "Guión
gráfico.historia
55
¿Es esta la forma estándar actual de configurar el controlador de vista inicial en appdelegate ? Pregunto porque parece un poco hack (lo siento @Abs).
rigdonmr
10
@rigdonmr Si la aplicación tiene un Storyboard configurado como la Interfaz principal, la ventana se carga automáticamente y su controlador de vista raíz se configura en el controlador de vista inicial del storyboard. Si el controlador de vista necesita cambiar en función de una condición, o la aplicación no tiene una interfaz principal, es aceptable inicializar ay UIWindowconfigurar su controlador de vista raíz mediante programación.
JAL
2
Lo sorprendente (pero bueno) aquí es que instanciar el controlador de vista manualmente de esta manera parece evitar que iOS cree una instancia del controlador de vista predeterminado. Podría haber esperado que ambos se cargaran. ¿Está este comportamiento documentado en alguna parte?
Pat Niemeyer
2
@MayankJain esto funciona bien con Swift 3, solo necesito traducir parte del código de swift anterior
JAB
42

Prueba esto. Por ejemplo: debe usar UINavigationControllercomo controlador de vista inicial. Luego, puede configurar cualquier controlador de vista como raíz del guión gráfico.

 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
}

Ver la pantalla de mi guión gráfico.

protikhonoff
fuente
¿Estableció la ID del guión gráfico para su controlador de vista en el guión gráfico? Ver joxi.ru/l2ZYxZqS8JOomJ
protikhonoff el
Sí, ya está configurado, creo que está abriendo con éxito los controladores de vista, pero no lo está 'mostrando'. ¿Algunas ideas?
Abubakar Moallim
Sin errores, después del lanzamiento de la pantalla, recibo una página negra
Abubakar Moallim
Supongo que encontré el problema. Debe marcar "Es el controlador de vista inicial" en su guión gráfico. joxi.ru/8AnNbQlhq3QOAO
protikhonoff
pero quiero cambiar el viewcontroller inicial usando una declaración condicional.
Abubakar Moallim
24

Para Swift 3, Swift 4:

Instanciar el controlador de vista raíz del guión gráfico:

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 quieres usarlo UINavigationControllercomo 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
    }

Instanciar el controlador de vista raíz desde xib:

Es casi lo mismo, pero en lugar de líneas

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

tendrás que escribir

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

si no está usando el guión gráfico, puede probar esto

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
}
Jibin jose
fuente
1
¿A qué se refiere el nombre de la punta?
Abubakar Moallim
@Abs nibName es el nombre de la punta que se cargará para crear una instancia de la vista.
rashii
Las animaciones de transición de orientación dejan de funcionar con esto.
user3427013
Ya voté por este jajaja ... "tengo que iniciar la ventana y luego configurar su marco, tengo que iniciar la ventana y luego configurar su marco, tengo que iniciar la ventana y luego configurar su marco" -me para mí
Chris Allinson
18

Para los nuevos Xcode 11.xxx y Swift 5.xx, donde el objetivo se estableció en iOS 13+.

Para la nueva estructura del proyecto, AppDelegate no tiene que hacer nada con respecto a rootViewController.

Existe una nueva clase para manejar la clase de ventana (UIWindowScene) -> archivo '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()
    }

}
gamal
fuente
1
Muy apreciado.
Azim Talukdar
14

Aquí hay una buena manera de abordarlo. Este ejemplo coloca un controlador de navegación como el controlador de vista raíz, y coloca el controlador de vista de su elección dentro de él en la parte inferior de la pila de navegación, listo para que empuje lo que necesite.

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

Para que este ejemplo funcione, debe configurar "MainViewController" como ID del guión gráfico en su controlador de vista principal, y el nombre del archivo del guión gráfico en este caso sería "MainStoryboard.storyboard". Renombro mis guiones gráficos de esta manera porque Main.storyboard para mí no es un nombre propio, especialmente si alguna vez vas a subclasificarlo.

John Bushnell
fuente
11

Lo había hecho en Objective-C espero que sea útil para usted

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];
Patel Jigar
fuente
¿Cómo diseñaste View Controllers en storyboard? Por favor, ayuda.
Poonam
arrastre los controladores de vista y configure el ID del guión gráfico de identidad: <ViewControllerName> y acceda a su controlador de vista ...
Patel Jigar
@PatelJigar cómo configurar en loginvc
Uma Madhavi
llame al controlador de vista como este UITabBarController * tbc = [self.storyboard instantiateViewControllerWithIdentifier: @ "ContentViewController"]; [self presentViewController: tbc animated: YES complete: nil];
Patel Jigar
7

Código para el código Swift 4.2 y 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()
}

Y para 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()
         }
    }
}
Jamil Hasnine Tamim
fuente
self.window da error Valor del tipo 'AppDelegate' no tiene miembro 'window', ¿alguna idea?
Joseph Astrahan
@JosephAstrahan declara una variable antes de llamarla. Me gusta - var window: UIWindow?.
Jamil Hasnine Tamim
@JosephAstrahan revisa mi respuesta nuevamente. Agregué variable.
Jamil Hasnine Tamim
Gracias, eso ayuda mucho!
Joseph Astrahan
And for Xcode 11+ and for Swift 5+parte me ayuda mucho. gracias hombre
Torongo
6

Lo había hecho en Xcode 8 y swift 3.0 espero que sea útil para usted y que funcione perfectamente. Use el siguiente código:

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
}

Y si está utilizando el controlador de navegación, use el siguiente código para eso:

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
}
Kunal
fuente
Hola ... Mayank, lo había hecho en Xcode 8 y swift 3.0. Qué error aparece después de usar esta solución porque funciona
Kunal
6

Swift 4:

Agregue estas líneas dentro de AppDelegate.swift, dentro de la función 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
}

Ahora, por ejemplo, muchas veces hacemos algo como esto cuando queremos llevar al usuario a una pantalla de inicio de sesión o a una pantalla de configuración inicial o volver a la pantalla principal de la aplicación, etc. Si también desea hacer algo así , puede usar este punto como una bifurcación en el camino para eso.

Piénsalo. Podría tener un valor almacenado en NSUserDefaults, por ejemplo, que contenía un booleano userLoggedInif userLoggedIn == false { use this storyboard & initialViewController... } else { use this storyboard & initialViewController... }

Vendedores de Wade
fuente
no funciona en un nuevo proyecto con 1 ViewController agregado. Siempre comienza desde el controlador de vista inicial. Xcode 11.2 ¿Dónde puede haber un problema?
Oleh H
5

Bueno, todas las respuestas arriba / abajo están generando una advertencia sobre la ausencia de un punto de entrada en el guión gráfico.

Si desea tener 2 (o más) controladores de vista de entrada que dependen de alguna condición (por ejemplo, conditionVariable ), entonces lo que debe hacer es:

  • En su Main.storyboard cree UINavigationController sin rootViewController, configúrelo como punto de entrada
  • Cree 2 (o más) segues "Mostrar" en controladores de vista, asígneles alguna identificación, digamos id1 e id2
  • Use el siguiente código:

    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
       }

Espero que esto ayude.

Borzh
fuente
1
el error "sin punto de entrada en el guión gráfico" se debe a una configuración de proyecto que se puede eliminar. vaya a proyecto> información> propiedades de destino de iOS personalizadas y elimine la propiedad "Nombre base del archivo del guión gráfico principal". La advertencia ya no debería aparecer.
orangemako
5

Si no estás usando el guión gráfico. Puede inicializar su controlador de vista principal mediante programación.

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

Y también eliminar Mainde la información de implementación .

ingrese la descripción de la imagen aquí

p-sun
fuente
Esto funcionó conmigo en Swift 4.2, XCode 11.3, IOS 9 ~ 13.3.1
Codificador ACJHP
4

Aquí está la solución completa en Swift 4, implemente esto en 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")

    }
}

escriba esta función en cualquier lugar dentro de 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()
}
M Murteza
fuente
3

En caso de que desee hacerlo en el controlador de vista y no en el delegado de la aplicación: solo busque la referencia al AppDelegate en su controlador de vista y restablezca su objeto de ventana con el controlador de vista correcto como 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()
Ankit Goel
fuente
3

Para swift 4.0 .

En su archivo AppDelegate.swift en el método didfinishedlaunchingWithOptions , coloque el siguiente código.

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
}

Espero que funcione bien.

Rubaiyat Jahan Mumu
fuente
3
Funcionó ... Si no ha configurado viewController inicial en stroyboard, entonces debe agregar window = UIWindow (frame: UIScreen.main.bounds)
Punit
3

Swift 5 y Xcode 11

Entonces, en xCode 11, la solución de ventana ya no es válida dentro de appDelegate. Lo trasladaron al SceneDelgate. Puede encontrar esto en el archivo SceneDelgate.swift.

Notarás que ahora tiene un var window: UIWindow?regalo.

En mi situación, estaba usando un TabBarController de un guión gráfico y quería establecerlo como rootViewController.

Este es mi código:

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

Asegúrese de agregar esto al método de escena correcto como lo hice aquí. Tenga en cuenta que deberá establecer el nombre del identificador para el tabBarController o viewController que está utilizando en el guión gráfico.

cómo configurar la ID del guión gráfico

En mi caso, estaba haciendo esto para establecer un stateController para realizar un seguimiento de las variables compartidas entre las vistas de pestaña. Si desea hacer lo mismo, agregue el siguiente código ...

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: Simplemente use sus propias variables o lo que sea que esté tratando de hacer un seguimiento, en cambio, enumeré las mías como un ejemplo en tdfvariables struct.

En cada vista de TabController, agregue la siguiente variable miembro.

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

Luego, en esos mismos archivos, agregue lo siguiente:

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

Lo que hace es permitirle evitar el enfoque singleton para pasar variables entre las vistas. Esto permite fácilmente el modelo de inyección de dependencia, que es mucho mejor a largo plazo que el enfoque singleton.

Joseph Astrahan
fuente
3

Inhabilitar Main.storyboard

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

Agregar ID del guión gráfico

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

Swift 5 y Xcode 11

Ampliar UIWindow

class CustomWindow : UIWindow {
    //...
}

Edición generada por 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()
    }

    //...
}
yoAlex5
fuente
Puede establecer el controlador raíz en el controlador de vista inicial window.rootViewController = UIStoryboard (nombre: "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 !
AG
fuente
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
}
Mukul Sharma
fuente
1

Abra un viewcontroller con el delegado SWRevealViewController From 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()
Abdul Qayyum
fuente
0

Para 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()
        }
    }
Utsav Dave
fuente