当前位置: 首页 > 面试题库 >

“必需”初始化程序“ init(coder :)”必须由“ UITableViewCell”的子类提供

陶柏
2023-03-14
问题内容

据报道,这段代码在这里和这里都有效,但是我似乎无法使其正常工作。

IBOutlet已连接到情节提要中的对象。命名了prototypeCell,因此我可以将其使用,dequeueReusableCellWithIdentifier并将其自定义类属性设置为commentCell

First Error(我可以解决,但上面的链接都不需要它,这使我觉得我做错了。对吗?):

Overriding method with selector 'initWithStyle:reuseIdentifier:' has incompatible type '(UITableViewCellStyle, String) -> commentCell'

第二个错误(有趣的错误):

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

单元类别代码:

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

    init(style: UITableViewCellStyle, reuseIdentifier: String) {
        super.init(style: style, reuseIdentifier: reuseIdentifier)
    }

    override func awakeFromNib() {
        super.awakeFromNib()
    }

    override func setSelected(selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)
    }
}

初始化代码:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    println(comments[indexPath.row])

    var cell = self.tableView.dequeueReusableCellWithIdentifier("prototypeCell") as commentCell

    cell.commentLabel.text = comments[indexPath.row]["comment"] as NSString
    cell.authorLabel.text = comments[indexPath.row]["fromid"] as NSString
    return cell
}

问题答案:

第一个初始化程序的正确签名是:

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

请注意,reuseIdentifierOptional,如所示?

如果您重写了类的任何指定的初始值设定项,则不会继承任何其他指定的初始值设定项。但是UIView采用该NSCoding协议,这需要一个init(coder:)初始化程序。因此,您也必须实现这一点:

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

但是请注意,除了调用super之外,您实际上都没有在任何一个初始化器中执行任何操作,因此您无需实现任何一个初始化器!如果您不重写任何指定的初始值设定项,则您将继承超类的所有指定的初始值设定项。

因此,我的建议是,init(style:reuseIdentifier:)除非您要向其中添加一些初始化,否则请完全删除它。

而且,如果您打算对其进行一些初始化,请注意,情节提要中的原型单元 不要
由初始化init(style:reuseIdentifier:)。它们由初始化init(coder:)



 类似资料:
  • 问题内容: 我决定继续与Swift一起完成剩余的项目。当我将自定义类(的子类)添加到情节提要视图控制器并加载项目时,该应用突然崩溃,并出现以下错误: 致命错误:对类使用未实现的初始化程序“ init(coder :)” 这是一个代码: 请提出一些建议 问题答案: 这是由于目标上没有初始化程序引起的。该方法是必需的,因为从调用实例化a 。 为什么Objective-C没问题? 因为 Objectiv

  • 问题内容: 为什么Kotlin对此抱怨: 编译器抱怨在Line中由处理程序再次发布。这在纯Java中确实有效: 问题答案: Kotlin认为一个属性在其初始化程序结束之前尚未初始化,因此即使在lambda中也无法在其自己的初始化程序中使用该属性。这种语义类似于其初始化程序内部局部变量使用的限制。 有几种解决方法: 使用对象表达式可以引用已声明的对象: } 这仅适用于接口作为lambda的替代品,并

  • 问题内容: 是否有一种标准方法可以在Swift中制作“纯虚函数”,即。一个 必须 由每个子类中被覆盖,并且,如果不是的话,将导致编译时错误? 问题答案: 您有两种选择: 将超类定义为协议而不是类 Pro :编译时检查每个“子类”(不是实际的子类)是否实现了所需的方法 缺点 :“超类”(协议)无法实现方法或属性 2.声明该方法的超级版本 例: Pro :可以在超类中实现方法和属性 缺点 :不检查编译

  • 这肯定是个愚蠢的问题,但我对Kotlin真的是个新手,我没有找到任何解决办法。 如何声明类字段?就像我们可以在Java中拥有它一样: 在中: 但我得到一个警告:“属性必须初始化或抽象”

  • 问题内容: 这是我更新到后遇到的一个有趣的问题 错误就在网上 问题答案: 编译器告诉您不能使用,因为它完全没有必要。您没有要打开的任何可选选项:不是可选的,并且该属性也不是可选的。仅用于解开可选项。如果要创建一个名为的新常量,请执行以下操作: 但是,旁注:具有一个名为参数的参数和一个名为局部常量的参数会造成极大的混淆。这样可能会更好: