Estoy usando el siguiente código para navegar programáticamente a otro ViewController. Funciona bien, pero de alguna manera oculta el navigation bar
. ¿Cómo puedo solucionar esto? (la barra de navegación se crea insertando el ViewController
en el navigation controller
si eso importa).
let storyBoard : UIStoryboard = UIStoryboard(name: "Main", bundle:nil)
let nextViewController = storyBoard.instantiateViewControllerWithIdentifier("nextView") as NextViewController
self.presentViewController(nextViewController, animated:true, completion:nil)
fuente
storyBoard.instantiateViewController
yself.present
desde el hilo principal, o tendrá un retraso en la aparición de los componentes de viewControllerSWIFT 4.x
Las cadenas entre comillas dobles siempre me confunden, así que creo que la respuesta a esta pregunta necesita una presentación gráfica para aclarar esto.
Para una aplicación bancaria, tengo un LoginViewController y un BalanceViewController. Cada uno tiene sus respectivas pantallas.
La aplicación se inicia y muestra la pantalla de inicio de sesión. Cuando el inicio de sesión es exitoso, la aplicación abre la pantalla Balance.
Así es como se ve:
El éxito del inicio de sesión se maneja así:
let storyBoard: UIStoryboard = UIStoryboard(name: "Balance", bundle: nil) let balanceViewController = storyBoard.instantiateViewController(withIdentifier: "balance") as! BalanceViewController self.present(balanceViewController, animated: true, completion: nil)
Como puede ver, el 'balance' de ID del guión gráfico en letras pequeñas es lo que va en la segunda línea del código, y este es el ID que se define en la configuración del guión gráfico, como en la captura de pantalla adjunta.
El término 'Balance' con mayúscula 'B' es el nombre del archivo del guión gráfico , que se utiliza en la primera línea del código.
Sabemos que usar cadenas codificadas de forma rígida en el código es una muy mala práctica, pero de alguna manera en el desarrollo de iOS se ha convertido en una práctica común, y Xcode ni siquiera advierte sobre ellos.
fuente
Debe impulsar el nuevo controlador de vista utilizando el controlador de navegación actual, no presente.
self.navigationController.pushViewController(nextViewController, animated: true)
fuente
push
usar el controlador de vista con su controlador de navegación. (que se animará de izquierda a derecha) si solo desea mostrar, presentar, una ventana emergente en la pantalla actual (que se animará de abajo hacia arriba), solo usepresent
.Según @jaiswal Rajan en su respuesta . Puedes hacer un pushViewController como este:
let storyBoard: UIStoryboard = UIStoryboard(name: "NewBotStoryboard", bundle: nil) let newViewController = storyBoard.instantiateViewController(withIdentifier: "NewViewController") as! NewViewController self.navigationController?.pushViewController(newViewController, animated: true)
fuente
Entonces, si presenta un controlador de vista, no se mostrará en el controlador de navegación. Solo tomará la pantalla completa. Para este caso, debe crear otro controlador de navegación y agregar su
nextViewController
como root para esto y presentar este nuevo controlador de navegación.Otra forma es simplemente presionar el controlador de vista.
self.presentViewController(nextViewController, animated:true, completion:nil)
Para obtener más información, consulte la documentación de Apple: - https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIViewController_Class/#//apple_ref/doc/uid/TP40006926-CH3-SW96
fuente
presentViewController
ha cambiado de nombre apresent(loginController, animated:true, completion:nil)
OperationQueue.main.addOperation { let storyBoard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil) let newViewController = storyBoard.instantiateViewController(withIdentifier: "Storyboard ID") as! NewViewController self.present(newViewController, animated: true, completion: nil) }
Me funcionó cuando puse el código dentro del
OperationQueue.main.addOperation
, que se ejecutará en el hilo principal por mí.fuente
El código anterior funciona bien, pero si desea navegar desde una
NSObject
clase, donde no puede usarself.present
:let storyBoard = UIStoryboard(name:"Main", bundle: nil) if let conVC = storyBoard.instantiateViewController(withIdentifier: "SoundViewController") as? SoundViewController, let navController = UIApplication.shared.keyWindow?.rootViewController as? UINavigationController { navController.pushViewController(conVC, animated: true) }
fuente
Todas las demás respuestas suenan bien, me gustaría cubrir mi caso, donde tuve que hacer una LaunchScreen animada, luego, después de 3 a 4 segundos de animación, la siguiente tarea fue pasar a la pantalla de inicio. Intenté segues, pero eso creó un problema para la vista de destino. Así que al final accedí a la propiedad Window de AppDelegates y le asigné una nueva pantalla NavigationController,
let storyboard = UIStoryboard(name: "Main", bundle: nil) let appDelegate = UIApplication.shared.delegate as! AppDelegate let homeVC = storyboard.instantiateViewController(withIdentifier: "HomePageViewController") as! HomePageViewController //Below's navigationController is useful if u want NavigationController in the destination View let navigationController = UINavigationController(rootViewController: homeVC) appDelegate.window!.rootViewController = navigationController
En caso de que no desee navigationController en la vista de destino, simplemente asigne como,
let storyboard = UIStoryboard(name: "Main", bundle: nil) let appDelegate = UIApplication.shared.delegate as! AppDelegate let homeVC = storyboard.instantiateViewController(withIdentifier: "HomePageViewController") as! HomePageViewController appDelegate.window!.rootViewController = homeVC
fuente