present open new swift uiviewcontroller storyboard init

open - swift-Inicializa el controlador de vista desde el guión gráfico anulando init



swift 4 open viewcontroller programmatically (2)

Un inicializador de conveniencia siempre debe delegar a un inicializador designado para la misma clase, y un inicializador designado debe llamar a un inicializador de superclase.

Dado que la superclase no tiene un inicializador adecuado, es probable que un método de fábrica de clase le sirva mejor:

static func instantiate() -> SearchTableViewController { return UIStoryboard(name: "Main", bundle: nil).instantiateViewControllerWithIdentifier("SearchTableViewController") as! SearchTableViewController }

entonces use:

var myViewController = SearchTableViewController.instantiate()

Tengo una instancia de ViewController definida en un guión gráfico. Puedo inicializarlo por el siguiente

var myViewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewControllerWithIdentifier("myViewControllerIdentifier") as! ViewController

¿Hay alguna manera de anular el método init de ViewController para que pueda inicializarlo usando

var myViewController = ViewController()

Intenté anular init

convenience init() { self = UIStoryboard(name: "Main", bundle: nil).instantiateViewControllerWithIdentifier("SearchTableViewController") as! SearchTableViewController }

Pero al compilador no le gusta eso. ¿Algunas ideas?


Un método de fábrica de clase es el camino a seguir por ahora. Aquí hay un protocolo que puede usar para agregar rápidamente el soporte de makeFromStoryboard a todos los UIViewController s.

protocol StoryboardInstantiable { static var storyboardName: String { get } static var storyboardBundle: NSBundle? { get } static var storyboardIdentifier: String? { get } } ​ extension StoryboardInstantiable { static var storyboardBundle: NSBundle? { return nil } static var storyboardIdentifier: String? { return nil } static func makeFromStoryboard() -> Self { let storyboard = UIStoryboard(name: storyboardName, bundle: storyboardBundle) if let storyboardIdentifier = storyboardIdentifier { return storyboard.instantiateViewControllerWithIdentifier(storyboardIdentifier) as! Self } else { return storyboard.instantiateInitialViewController() as! Self } } }

Ejemplo:

extension MasterViewController: StoryboardInstantiable { static var storyboardName: String { return "Main" } static var storyboardIdentifier: String? { return "Master" } }

En caso de que el controlador de vista sea el controlador de vista inicial en el guión gráfico, simplemente puede ignorar el storyboardIdentifier .

En caso de que todos los controladores de vista se encuentren en el mismo guión gráfico, también puede anular el nombre del storyboardName bajo la extensión StoryboardInstantiable y devolver el nombre.