I decided to continue my remaining project with Swift. When I add the custom class (subclass of UIViewcontroller
) to my storyboard view controller and load the project, the app crashes suddenly with the following error:
fatal error: use of unimplemented initializer 'init(coder:)' for class
This is a code:
import UIKit
class TestViewController: UIViewController {
init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {
super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
// Custom initialization
}
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
/*
// #pragma mark - Navigation
// In a storyboard-based application, you will often want to do a little preparation before navigation
override func prepareForSegue(segue: UIStoryboardSegue?, sender: AnyObject?) {
// Get the new view controller using [segue destinationViewController].
// Pass the selected object to the new view controller.
}
*/
}
Please suggest something
This is caused by the absence of the initializer init?(coder aDecoder: NSCoder)
on the target UIViewController
. That method is required because instantiating a UIViewController
from a UIStoryboard
calls it.
To see how we initialize a UIViewController
from a UIStoryboard
, please take a look here
Because Objective-C automatically inherits all the required UIViewController
initializers.
Swift by default does not inherit the initializers due to safety. But it will inherit all the initializers from the superclass if all the properties have a value (or optional) and the subclass has not defined any designated initializers.
Manually implementing init?(coder aDecoder: NSCoder)
on the target UIViewController
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
Removing init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?)
on your target UIViewController
will inherit all of the required initializers from the superclass as Dave Wood pointed on his answer below