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.