I have a ViewController instance defined in a storyboard. I can initialize it by the following
var myViewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewControllerWithIdentifier("myViewControllerIdentifier") as! ViewController
Is there a way to override the init method of ViewController so that I can initialize it using
var myViewController = ViewController()
I tried overriding init
convenience init() {
self = UIStoryboard(name: "Main", bundle: nil).instantiateViewControllerWithIdentifier("SearchTableViewController") as! SearchTableViewController
}
but the compiler doesn't like that. Any ideas?
A convenience initializer must always delegate to a designated initializer for the same class, and a designated initializer must call a superclass initializer.
Since the superclass doesn't have an appropriate initializer, you would probably be better served by a class factory method:
then use:
A class factory method is the way to go for now. Here's a protocol that you can use to quickly add
makeFromStoryboard
support to allUIViewController
s.Example:
In case the view controller is the initial view controller in the storyboard, you can simply ignore
storyboardIdentifier
.In case all the view controllers are in the same storyboard, you can also override
storyboardName
under theStoryboardInstantiable
extension and return the name.