'required' initializer 'init(coder:)' must be provided by subclass of 'UITableViewCell'` 'required' initializer 'init(coder:)' must be provided by subclass of 'UITableViewCell'` ios ios

'required' initializer 'init(coder:)' must be provided by subclass of 'UITableViewCell'`


The correct signature for the first initializer is this:

init(style style: UITableViewCellStyle, reuseIdentifier reuseIdentifier: String?)

Notice that reuseIdentifier is an Optional, as indicated by the ?.

If you override any of a class's designated initializers, you don't inherit any other designated initializers. But UIView adopts the NSCoding protocol, which requires an init(coder:) initializer. So you must implement that one too:

init(coder decoder: NSCoder) {    super.init(coder: decoder)}

Note, however, that you're not actually doing anything in either initializer except calling super, so you don't need to implement either initializer! If you don't override any designated initializers, you inherit all of your superclass's designated initializers.

So my advice is that you just remove your init(style:reuseIdentifier:) initializer entirely unless you're going to add some initialization to it.

And if you're planning to add some initialization to it, be advised that prototype cells in a storyboard are not initialized by init(style:reuseIdentifier:). They are initialized by init(coder:).


Not sure why you need a custom UITableViewCell class if you are using storyboard with a prototype cell. You can just drop your labels and textviews into the cell and work with them.

If you are working from a xib then I get it, but you only need:

class commentCell: UITableViewCell {    @IBOutlet weak var authorLabel: UILabel!    @IBOutlet weak var commentLabel: UITextView!}

You would then register the xib in the TableView class with:

override func viewDidLoad() {        super.viewDidLoad()        self.tableView.registerNib(UINib(nibName: "commentCell", bundle: nil),            forCellReuseIdentifier: "reuseIdentifier")    }

Regarding the cellForRowAtIndexPath function, the syntax is now a little modified:

func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell! { var cell = self.tableView.dequeueReusableCellWithIdentifier("prototypeCell") as commentCell        return cell    }

If you want to post to github, we can help make modifications. It's hard to be specific without seeing more of the code.


The right way to inherit UITableViewCell in Swift 4:

class MyTableViewCell: UITableViewCell{        override init(style: UITableViewCellStyle, reuseIdentifier: String?)    {        super.init(style: style, reuseIdentifier: reuseIdentifier)    }    required init?(coder aDecoder: NSCoder)    {        super.init(coder: aDecoder)    }}