Swift presentViewController
ios8 (12)
Programáticamente tengo varios controladores de vista en un proyecto Swift de iOS. No tengo los guiones gráficos y me gustaría evitarlos si es posible. ¿Hay alguna manera de cambiar a otro archivo viewcontroller.swift
(lo llamaremos view2.swift
) y hacer que forme parte de una función a la que llama un botón?
He probado lo siguiente:
let storyboard: UIStoryboard = UIStoryboard(name: "myTabBarName", bundle: nil)
let vc: UIViewController = storyboard.instantiateViewControllerWithIdentifier("myVCID") as UIViewController
self.presentViewController(vc, animated: true, completion: nil)
Lo anterior funciona con guiones gráficos, pero quiero que se view2.swift
a otro view2.swift
. Se puede hacer esto?
No es necesario crear una instancia del ViewController en el Guión gráfico para que el present()
ViewController present()
funcione. Esa es una solución pirata.
Si ve una pantalla en blanco / negro cuando presenta un VC, puede ser porque está llamando a present()
desde viewDidLoad()
en el First / RootViewController, pero la primera vista aún no está lista.
Llame a present()
desde viewDidAppear
para arreglar esto, es decir:
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
let yourVC = YourViewController()
self.present(yourVC, animated: true, completion: nil)
}
Una vez que viewDidLoad()
"Vista" en su aplicación, puede comenzar a llamar a present () desde viewDidLoad()
.
Usar UINavigationController
(como se sugiere en una respuesta) es otra opción, pero podría ser una exageración para resolver este problema. Podría terminar complicando el flujo de usuarios. Use la solución basada en UINavigationController
solo si desea tener una UINavigationController
Navigaton o si desea volver al controlador de vista anterior.
Otra posibilidad es que no tenga el XIB incluido en su objetivo de compilación (que es lo que me pasó).
Esto podría suceder si tiene un objetivo diferente para Dev, Probar y lanzar versiones (que debería tener de todos modos).
Para aquellos que consiguen pantallas en blanco / negro, este código funcionó para mí.
let vc = self.storyboard?.instantiateViewController(withIdentifier: myVCID) as! myVCName
self.present(vc, animated: true, completion: nil)
Para establecer el "Identificador" en su VC, simplemente vaya al inspector de identidad para la VC en el guión gráfico. Establezca la ''ID de guión gráfico'' en el identificador que quiera que sea. Mira la imagen de abajo para referencia.
Para mí, tuve dos vistas en dos controladores de navegación separados. Tuve que usar una combinación de lo anterior.
var vc = self.storyboard?.instantiateViewControllerWithIdentifier("WelcomeViewController") as! WelcomeViewController
var navigationController = UINavigationController(rootViewController: vc)
self.presentViewController(navigationController, animated: true, completion: nil)
Swift 3.x
let secondVC = self.storyboard?.instantiateViewController(withIdentifier: "VC-ID" as! yourViewController
let navigationVC = UINavigationController(rootViewController: secondVC)
self.present(navigationVC, animated: true, completion: nil)
Prueba esto:
let vc = ViewController() //change this to your class name
self.presentViewController(vc, animated: true, completion: nil)
Con Swift3:
self.present(vc, animated: true, completion: nil)
Puedes usar el código:
if let vc = self.storyboard?.instantiateViewController(withIdentifier: "secondViewController") as? secondViewController {
let appDelegate = UIApplication.shared.delegate as! AppDelegate
appDelegate.window?.rootViewController = vc
}
Puedes usar el siguiente código:
var vc = self.storyboard?.instantiateViewControllerWithIdentifier("YourViewController") as! YourViewController;
vc.mode_Player = 1
self.presentViewController(vc, animated: true, completion: nil)
Resolvió la pantalla negra agregando un controlador de navegación y configurando el segundo controlador de vista como rootVC.
let vc = ViewController()
var navigationController = UINavigationController(rootViewController: vc)
self.presentViewController(navigationController, animated: true, completion: nil
Solo use esto: asegúrese de usar nibName, de lo contrario las vistas precargadas de xib no se mostrarán:
var vc : ViewController = ViewController(nibName: "ViewController", bundle: nil)
// cambia esto a su nombre de clase
self.presentViewController(vc, animated: true, completion: nil)
Para referencia, porque esta pregunta es uno de los primeros resultados de Google.
Rompiendo cambio en Swift 3:
El método presentViewController
se reemplaza por el método present
.
Puedes usarlo como el anterior:
self.present(viewControllerToPresent, animated: true, completion: nil)
Ejemplo para abrir la cámara:
let imagePicker = UIImagePickerController()
imagePicker.delegate = self
imagePicker.sourceType = UIImagePickerControllerSourceType.camera
imagePicker.allowsEditing = false
self.present(imagePicker, animated: true, completion: nil)
Swift 3 y Swift 4
let vc = self.storyboard?.instantiateViewController(withIdentifier: "idMyViewControllerName") as! MyViewControllerName
self.present(vc, animated: true, completion: nil)