Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Fatal error: use of unimplemented initializer 'init(coder:)' for class

Issue

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

Why is this not a problem with Objective-C?

Because Objective-C automatically inherits all the required UIViewController initializers.

Why doesn't Swift automatically inherit the 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.


Solution

1. First method

Manually implementing init?(coder aDecoder: NSCoder) on the target UIViewController

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

2. Second method

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



Another option besides @3r1d's is to instead remove the following init method from your class:

init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {
    super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
    // Custom initialization
}

Including that init method, prevents the sub class from inheriting the init(coder aDecoder: NSCoder!) from its super class. By not including it, your class will inherit both.

Note: See WWDC 2014 Session 403 "Intermediate Swift" at about the 33:50 mark for more details.


For people having the same issue with swift UICollectionViewCells, add the code that @3r1d suggested to your custom UICollectionViewCell class and not to the View Controller:

init(coder aDecoder: NSCoder!)
{
    super.init(coder: aDecoder)
}

For those needing the code in Swift:

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

[Edit] This was for an older version of Swift. Possibly doesn't work anymore.


I had this problem in a programmatic collectionView cell and even though the op is asking about a vc I still landed on this question when searching for an answer. For me the issue was I did have

required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}

implemented so the top answer didn't work. What I didn't have in the cell was the initializer:

// my programmatic cell was missing this
override init(frame: CGRect) {
    super.init(frame: frame)
}

Once I added it the error went away


Rather than adding some methods for making internal mechanism work fine, i would go with defining my attributes as @lazy and initialise them right in the class scope.