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.
Respuestas:
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 :
Código Swift 3 :
fuente
UIWindow
configurar su controlador de vista raíz mediante programación.Prueba esto. Por ejemplo: debe usar
UINavigationController
como controlador de vista inicial. Luego, puede configurar cualquier controlador de vista como raíz del guión gráfico.Ver la pantalla de mi guión gráfico.
fuente
Para Swift 3, Swift 4:
Instanciar el controlador de vista raíz del guión gráfico:
Si quieres usarlo
UINavigationController
como root:Instanciar el controlador de vista raíz desde xib:
Es casi lo mismo, pero en lugar de líneas
tendrás que escribir
fuente
si no está usando el guión gráfico, puede probar esto
fuente
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'.
fuente
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.
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.
fuente
Lo había hecho en Objective-C espero que sea útil para usted
fuente
Código para el código Swift 4.2 y 5:
Y para
Xcode 11+
and for Swift 5+
:fuente
var window: UIWindow?
.And for Xcode 11+ and for Swift 5+
parte me ayuda mucho. gracias hombreLo 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:
Y si está utilizando el controlador de navegación, use el siguiente código para eso:
fuente
Swift 4:
Agregue estas líneas dentro de AppDelegate.swift, dentro de la función didFinishLaunchingWithOptions () ...
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 userLoggedIn
if userLoggedIn == false { use this storyboard & initialViewController... } else { use this storyboard & initialViewController... }
fuente
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:
Use el siguiente código:
Espero que esto ayude.
fuente
Si no estás usando el guión gráfico. Puede inicializar su controlador de vista principal mediante programación.
Swift 4
Y también eliminar
Main
de la información de implementación .fuente
Aquí está la solución completa en Swift 4, implemente esto en didFinishLaunchingWithOptions
escriba esta función en cualquier lugar dentro de Appdelegate.swift
fuente
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.
fuente
Para swift 4.0 .
En su archivo AppDelegate.swift en el método didfinishedlaunchingWithOptions , coloque el siguiente código.
Espero que funcione bien.
fuente
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
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.
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
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.
Luego, en esos mismos archivos, agregue lo siguiente:
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.
fuente
Inhabilitar
Main.storyboard
Agregar ID del guión gráfico
Swift 5 y Xcode 11
Ampliar
UIWindow
Edición generada por Xcode
SceneDelegate.swift
fuente
fuente
fuente
Abra un viewcontroller con el delegado SWRevealViewController From App.
fuente
Para Swift 5+
fuente