一尘不染

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

swift

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

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
}

阅读 271

收藏
2020-07-07

共1个答案

一尘不染

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

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:)

2020-07-07