Pregunta Crear una instancia y presentar una vistaController en Swift


Problema

Empecé a echarle un vistazo al nuevo Swift en Xcode 6, y probé algunos proyectos de demostración y tutoriales. Ahora estoy atrapado en:

Instanciando y luego presentando un viewController desde un guión gráfico específico

Solución Objective-C

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"myStoryboardName" bundle:nil];
UIViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"myVCID"];
[self presentViewController:vc animated:YES completion:nil];

¿Cómo lograr esto en Swift?


236
2018-06-04 11:16


origen


Respuestas:


Todo es una cuestión de la nueva sintaxis, la funcionalidad no ha cambiado:

// Swift 3.0

let storyboard = UIStoryboard(name: "MyStoryboardName", bundle: nil)
let controller = storyboard.instantiateViewController(withIdentifier: "someViewController")
self.present(controller, animated: true, completion: nil)

Si tienes problemas con init(coder:), por favor refiérase a La respuesta de EridB.


512
2018-06-04 11:22



Para personas que usan Respuesta de @ akashivskyy crear instancias UIViewController y están teniendo la excepción:

error fatal: uso del inicializador no implementado 'init (codificador :)' para la clase

Consejo rapido:

Implementar manualmente required init?(coder aDecoder: NSCoder) en tu destino UIViewController que estás tratando de crear instancias

required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
}

Si necesita más descripción, consulte mi respuesta aquí


40
2018-06-04 11:30



Este enlace tiene ambas implementaciones:

Rápido:

let viewController:UIViewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewControllerWithIdentifier("ViewController") as UIViewController
self.presentViewController(viewController, animated: false, completion: nil)

C objetivo

UIViewController *viewController = [[UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil] instantiateViewControllerWithIdentifier:@"ViewController"];

Este enlace tiene código para iniciar viewcontroller en el mismo guión gráfico

/*
 Helper to Switch the View based on StoryBoard
 @param StoryBoard ID  as String
*/
func switchToViewController(identifier: String) {
    let viewController = self.storyboard?.instantiateViewControllerWithIdentifier(identifier) as! UIViewController
    self.navigationController?.setViewControllers([viewController], animated: false)

}

13
2017-08-21 11:26



¡La respuesta de akashivskyy funciona bien! Pero, en caso de que tenga problemas para regresar desde el controlador de vista presentado, esta alternativa puede ser útil. ¡Funcionó para mí!

Rápido:

let storyboard = UIStoryboard(name: "MyStoryboardName", bundle: nil)
let vc = storyboard.instantiateViewControllerWithIdentifier("someViewController") as! UIViewController
// Alternative way to present the new view controller
self.navigationController?.showViewController(vc, sender: nil)

Obj-C:

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MyStoryboardName" bundle:nil];
UIViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"someViewController"];
[self.navigationController showViewController:vc sender:nil];

10
2017-11-06 15:11



// "Main" is name of .storybord file "
let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
// "MiniGameView" is the ID given to the ViewController in the interfacebuilder
// MiniGameViewController is the CLASS name of the ViewController.swift file acosiated to the ViewController
var setViewController = mainStoryboard.instantiateViewControllerWithIdentifier("MiniGameView") as MiniGameViewController
var rootViewController = self.window!.rootViewController
rootViewController?.presentViewController(setViewController, animated: false, completion: nil)

Esto funcionó bien para mí cuando lo puse en AppDelegate


6
2018-01-08 17:17



Si quieres presentarlo modalmente, deberías tener algo como bramido:

let vc = self.storyboard!.instantiateViewControllerWithIdentifier("YourViewControllerID")
self.showDetailViewController(vc as! YourViewControllerClassName, sender: self)

5
2018-05-26 20:26



Si tienes un Viewcontroller que no usa ningún guion gráfico / Xib, puedes presionar a este VC en particular como se indica a continuación:

 let vcInstance : UIViewController   = yourViewController()
 self.present(vcInstance, animated: true, completion: nil)

2
2018-03-14 20:19



Swift 4:

    let storyboard = UIStoryboard(name: "Main", bundle: nil)
    let yourVC: YourVC = storyboard.instantiateViewController(withIdentifier: "YourVC") as! YourVC

2
2018-05-18 19:36