Configure mediante programación el controlador de vista inicial usando Storyboards

252

¿Cómo configuro programáticamente el InitialViewControllerStoryboard? Quiero abrir mi guión gráfico a una vista diferente dependiendo de alguna condición que puede variar de un lanzamiento a otro.

UserDev
fuente
1
Verifique esta respuesta sin previo aviso, sin borrar el guión gráfico principal en la configuración.
Borzh

Respuestas:

466

Cómo prescindir de un controlador de vista inicial ficticio

Asegúrese de que todos los controladores de vista iniciales tengan una ID de Storyboard.

En el guión gráfico, desmarque el atributo "Es el controlador de vista inicial" del primer controlador de vista.

Si ejecuta su aplicación en este punto, leerá:

Failed to instantiate the default view controller for UIMainStoryboardFile 'MainStoryboard' - perhaps the designated entry point is not set?

Y notará que su propiedad de ventana en el delegado de la aplicación ahora es nula.

En la configuración de la aplicación, vaya a su objetivo y a la Infopestaña. Hay claro el valor de Main storyboard file base name. En la Generalpestaña, borre el valor de Main Interface. Esto eliminará la advertencia.

Cree la ventana y el controlador de vista inicial deseado en el application:didFinishLaunchingWithOptions:método del delegado de la aplicación :

- (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
fuente
77
¡Amor! ¡Amor! ¡Amor! Usaré esto para cambiar entre dos árboles de controladores de vista completamente diferentes para IOS6 e IOS7. Parece la mejor manera de manejar la compatibilidad hacia atrás, mientras se utilizan todas las campanas y silbatos en IOS7.
Hunkpapa
66
Estoy aprendiendo programación iOS en Swift. ¿Alguien puede ayudarme a escribir el código anterior rápidamente? por favor ayuda. Gracias.
Raghavendra
1
didFinishLaunchingWithOptionsSe llama a @bdv cuando la aplicación se inicia en un nuevo proceso. Si va a la pantalla de inicio y vuelve a la aplicación, este método no se volverá a invocar. (A menos que iOS finalice debido a restricciones de memoria). Intente detener la aplicación e iniciarla nuevamente desde su IDE. Si el problema continúa, publícalo en SO y estaré encantado de ayudarte, amigo.
Travis
2
@peyman Según mi investigación, la ventana no existe una vez que se elimina la referencia al guión gráfico principal. Comenté la creación de instancias de ventana en mi proyecto actual y descubrí que este sigue siendo el caso.
Travis
2
@Raghav, aquí está el código rápido: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

Para todos los amantes de Swift , aquí está la respuesta de @Travis traducida a SWIFT :

Haz lo que @Travis explicó antes del código del objetivo C. Luego,

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
}

El ExampleViewControllersería el nuevo controlador de vista inicial que le gustaría mostrar.

Los pasos explicados:

  1. Cree una nueva ventana con el tamaño de la ventana actual y configúrela como nuestra ventana principal
  2. Cree una instancia de un guión gráfico que podamos usar para crear nuestro nuevo controlador de vista inicial
  3. Instancia nuestro nuevo controlador de vista inicial basado en su ID de Storyboard
  4. Establezca el controlador de vista raíz de nuestra nueva ventana como nuestro nuevo controlador que acabamos de iniciar
  5. Haz visible nuestra nueva ventana

¡Disfruta y feliz programación!

Nombre para mostrar
fuente
Me preguntaron a @Travis por esta versión, y luego ... gracias de cualquier manera.
dellos
La ID del guión gráfico se encuentra en la sección Identidad en el panel del inspector de identidad
Dominic
2
Un consejo para no necesitar el ID del guión gráfico es configurar explícitamente el controlador de vista inicial (rootViewController) en el guión gráfico y usar el método de instancia UIStoryboard.instantiateInitialViewController () para obtener el controlador en lugar de UIStoryboard.instantiateViewControllerWithIdentifier () propuesto anteriormente. El resto es igual.
Eric Boumendil
45

Puede configurar mediante programación el rootViewController de la ventana clave en (BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)launchOptions

por ejemplo:

- (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
fuente
¿Cómo iniciar entonces el punto de entrada original desde el controlador secundario UIViewController?
ooxio
@ooxio: puede almacenar el punto de entrada original en un lugar global y luego usarlo más adelante.
Chengjiong
esto es realmente útil si desea crear una instancia para iniciar sesión / registrarse o algo así ...
Miel
Esto es mucho más sencillo que la respuesta anterior de @ Travis porque no tiene que meterse con un millón de configuraciones de proyectos y retoques en IB. ¿A quién le importa si uno de sus controladores de vista es técnicamente el VC inicial predeterminado y luego se desvía programáticamente a uno diferente?
Danny
Tenga en cuenta que el controlador de vista inicial reemplazado designado por el guión gráfico seguirá siendo instanciado y pasará por el ciclo init()/ deinit(), pero sin ejecutar viewDidLoad()o inicializar correctamente IBOutlet-s. Asegúrese de que el código esté listo para ello.
Gary
14

Swift 3: Actualización al código 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
fuente
Gracias @MEK. Además, es posible que desee corregir la sintaxis de las declaraciones de cierre condicionales reemplazando los paréntesis finales con llaves.
Native_Mobile_Arch_Dev
9

Puede configurar el controlador rootviewcontroller de navegación como un controlador de vista principal. Esta idea puede usarse para el inicio de sesión automático según los requisitos de la aplicación.

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

Para usuarios 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];
}

Gracias

Bhavsar1311
fuente
6

Abra mainstoryboard, seleccione la vista que desea que comience primero, luego abra Utilidades -> Atributos. Debajo del "Controlador de vista" verá el botón de opción "Es el Controlador de vista inicial". Solo selecciónalo.

--- A la pregunta revisada:

Puede intentarlo: escriba un método en la sección ViewDidLoad de su vista inicial y cuando el método se ejecute al iniciar la aplicación, el método desencadena un segue a otra vista.

m.etka
fuente
Escribí el método en ViewDidLoad pero no funcionó y cuando lo escribí en viewdidAppear está funcionando, ¿puede explicar por qué sucede esto?
UserDev
Puede intentarlo: agregue un código de segue según sus condiciones a uno de los métodos apropiados en el archivo appDelegate.m. Por ejemplo, puede agregar un código de segue al método "applicationDidBecomeActive:".
m.etka
@Jagdev lo escribe en ViewDidAppear en lugar de ViewDidLoad.
Umair Khan Jadoon
El problema con este enfoque es que el controlador de vista inicial parece ser visible durante algún tiempo y luego cambia a otro que no es bueno desde el punto de vista de UX, por lo que no es una buena solución.
vishal dharankar
3

SWIFT 5

Si no tiene un ViewController establecido como ViewController inicial en el guión gráfico, debe hacer 2 cosas:

  1. Vaya a los OBJETIVOS de su proyecto, seleccione su proyecto -> General -> Borrar el campo Interfaz principal.
  2. Siempre dentro de los OBJETIVOS del proyecto, ahora vaya a Información -> Manifiesto de escena de aplicación -> Configuración de escena -> Rol de sesión de aplicación -> Elemento0 (Configuración predeterminada) -> elimine el campo de nombre del guión gráfico.

Finalmente, ahora puede agregar su código en 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
fuente
Esta es sin duda la respuesta más actual a partir de Xcode 11.5, y de hecho solucionó la Failed to instantiate the default view controller for UIMainStoryboardFile 'Main' - perhaps the designated entry point is not setadvertencia que tenía después de que decidí instanciar mi VC inicial en el código. Un punto importante, cuando @ rs7 dice "eliminar el campo de nombre del guión gráfico", significan toda la fila de la lista, no solo el contenido del campo en sí.
cdf1982
2

No creo que sea posible. En su lugar, puede tener un controlador inicial que tendrá segues a diferentes controladores de vista. En el inicio, puede decidir qué segue realizar mediante programación.

Shmidt
fuente
2

Puede configurar initial view controllerusando Interface Builder, así como mediante programación.

A continuación se muestra el enfoque utilizado programáticamente.

C objetivo :

        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;

Rápido:

        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
fuente
2

Creé una clase de enrutamiento para manejar la navegación dinámica y mantener limpia la clase AppDelegate, espero que también ayude a otros.

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

}

Y en tu AppDelegate llama a esto

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

Otra solución al usar Swift 3 y Swift 4 para evitar el lanzamiento de fuerza es así

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
}

Y a continuación se utiliza con 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
fuente
2

En AppDelegate.swiftpuedes agregar el siguiente código:

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

Por supuesto, debe implementar su lógica, según los criterios que elija para un controlador de vista apropiado.

Además, no olvide agregar una identidad (seleccione guión gráfico -> Escena del controlador -> Mostrar el inspector de identidad -> asignar StorboardID).

Nedim Talovic
fuente
1

RESPUESTA ACTUALIZADA para iOS 13 y delegado de escena:

asegúrese de que en su archivo info.plist vaya al Manifiesto de escena de aplicación -> Configuración de escena -> Rol de sesión de aplicación -> Elemento 0 y elimine la referencia al guión gráfico principal allí también. De lo contrario, recibirá la misma advertencia acerca de no crear una instancia del guión gráfico.

Además, mueva el código del delegado de la aplicación a la escena del método de delegado de escena (_: willConnectTo: opciones :), ya que aquí es donde se manejan los eventos del ciclo de vida.

bze12
fuente
0

Hace unos días me encontré con la misma situación. Un truco muy simple resolvió este problema. Puse oculto mi controlador de vista inicial antes del lanzamiento2. Si el controlador de vista inicial es el controlador correcto, se establece en visible en viewDidLoad. De lo contrario, se realiza una segue al controlador de vista deseado. Funciona perfectamente en iOS 6.1 y superior. Estoy seguro de que funciona en versiones anteriores de iOS.

m.etka
fuente
0

Gracias modificó esto de la siguiente manera en 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
fuente
0

Solución simple encontrada: no es necesario eliminar la "verificación del controlador de vista inicial" del guión gráfico y editar la pestaña de información del proyecto y usar makeKeyAndVisible, simplemente coloque

self.window.rootViewController = rootVC;

en

- (BOOL) application:didFinishLaunchingWithOptions:
alex1704
fuente
Pero usted todavía consigue rootVCa partir instantiateViewControllerWithIdentifier, ¿correcto?
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

Otra forma es presentar viewController,

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

Primero debe crear el objeto de su guión gráfico, luego cambiar la raíz (si es necesario) y luego tomar la referencia de un controlador de vista particular que se empuja al controlador de vista actual (si cambia la raíz) o simplemente presenta un nuevo controlador de vista que puede

VD Purohit
fuente
@VD Purohit, ¿puede describir más acerca de su respuesta para una mejor comprensión?
Prags
0

Swift 4, Xcode 9

en el archivo 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
fuente
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
fuente
comprobando en nsuser Valores predeterminados valor preferencias valor Completamente almacenado y comprobando condición en vista inicial Controlador Problema
charles
0

Swift 5 o superior # crea el controlador de vista de ruta con este código simple. Si está utilizando xcode 11 o superior, inicialice primero var window: UIWindow?en 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
fuente
0

Si prefiere no cambiar applicationDidFinish, puede hacer el siguiente truco:

Configure el controlador de navegación como un controlador de vista inicial y asígnele una clase personalizada 'MyNavigationController'. Luego puede ajustar su controlador de vista raíz durante viewDidLoad: anulará el controlador de vista raíz que configuró en su guión gráfico.

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

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

}
Kamen Dobrev
fuente
-3

Seleccione el controlador de vista que desea abrir primero y vaya al inspector de atributos. Vaya a la escena inicial y verifique la opción del controlador de vista inicial.

Ahora este será su controlador de vista inicial que se abrirá primero cuando se inicie la aplicación.

iMash
fuente