'需'初始化程序" init(编码器:)'必须由&UCEableViewCell'的子类提供

时间:2014-09-28 03:21:07

标签: ios uitableview swift

据报道,此代码有效herehere,但我似乎无法使其正常工作。

IBOutlets与故事板中的对象相连。 prototypeCell已命名,因此我可以将其与dequeueReusableCellWithIdentifier一起使用,并将其自定义类属性设置为commentCell

第一个错误(我可以解决,但上面的链接都不需要它,这让我觉得我做错了。我是对的吗?):

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
}

4 个答案:

答案 0 :(得分:41)

第一个初始值设定项的正确签名是:

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

请注意,reuseIdentifierOptional,如?所示。

如果您覆盖任何类的指定初始值设定项,则不会继承任何其他指定的初始值设定项。但UIView采用NSCoding协议,该协议需要init(coder:)初始值设定项。所以你也必须实现那个:

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

但请注意,除了调用super之外,您在任何初始化程序中都没有执行任何操作,因此您不需要实现任何初始化程序!如果您不覆盖任何指定的初始值设定项,则继承所有超类的指定初始值设定项。

所以我的建议是,您只需完全删除init(style:reuseIdentifier:)初始化程序,除非您要为其添加一些初始化。

如果您计划为其添加一些初始化,请注意故事板中的原型单元格由<{1}} 初始化。它们由init(style:reuseIdentifier:)初始化。

答案 1 :(得分:2)

如果您将故事板与原型单元格一起使用,则不确定为什么需要自定义UITableViewCell类。您可以将标签和文本视图放入单元格并使用它们。

如果您使用xib工作,那么我会得到它,但您只需要:

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

}

然后,您将在TableView类中使用以下命令注册xib:

override func viewDidLoad() {
        super.viewDidLoad()

        self.tableView.registerNib(UINib(nibName: "commentCell", bundle: nil),
            forCellReuseIdentifier: "reuseIdentifier")
    }

关于cellForRowAtIndexPath函数,语法现在有点修改:

func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell! {

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



        return cell
    }

如果您想发布到github,我们可以帮助您进行修改。没有看到更多的代码就很难具体。

答案 2 :(得分:1)

在Swift 4中继承UITableViewCell的正确方法:

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

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

答案 3 :(得分:0)

快捷键4

按照建议执行some __ob__: Observer,然后在要添加的自定义初始化程序中添加required init

例如:

super.init(nibName: nil, bundle: nil)