致命错误:尽管已实现,但未实现init(coder:)错误

73

我收到了一个错误信息:

致命错误:init(coder :)未被实现

这个错误是针对我自定义的UITableViewCell。该单元格没有注册,在storyboard中具有标识符cell,并使用dequeasreusablecell时出现的。在自定义单元格中,我的初始化设置如下:

代码:

override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
    print("test")
    super.init(style: style, reuseIdentifier: reuseIdentifier)
}

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

但是我仍然有错误。谢谢。


这可能是一个愚蠢的建议,但你尝试过清理和重建吗?如果你使用了Xcode的自动完成建议,它有时会继续显示错误。 - Evan Conrad
是的,我已经清理并重新启动了。但没有用。 - Lee
2个回答

176

用编码方法替换您的init方法:

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

实际上,如果您在Storyboard中创建了您的单元格 - 我相信它应该附加到您尝试创建它的tableView上。如果您没有在那里执行任何逻辑,那么您可以删除您的两种init方法。

更新:如果您需要添加任何逻辑 - 您可以在awakeFromNib()方法中执行此操作。

override func awakeFromNib() {
   super.awakeFromNib()
   //custom logic goes here   
}

3
嘿,太好了,谢谢!我移除了 "fatalError("init(coder:) has not been implemented")" 并替换为 "super.init(coder: aDecoder)"。是的,你说得对,即使没有初始化方法,单元格仍然可以工作,但我想在初始化单元格时添加手势识别器。再次感谢! - Lee
这很棒,而且它有效,但有人能解释一下为什么更改初始化程序会起作用吗? - jamryu
在问题的示例中,初始化器包含fatalError("init(coder:) has not been implemented")行,这会导致调用该初始化器时崩溃。 - ruslan.musagitov
我有什么遗漏吗?我得到了“在super.init调用时未初始化属性.<Class>。” - ScottyBlades
1
@ScottyBlades看起来是在调用super.init之前没有初始化您的实例属性之一。 - ruslan.musagitov

12
首先,您需要在方法签名下方添加语句super.init(coder: aDecoder),调用超类的init(coder:)方法。
required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
}

其次,您需要删除语句,

fatalError("init(coder:) has not been implemented")

这样应该就可以了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接