据报道,此代码有效here和here,但我似乎无法使其正常工作。
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
}
答案 0 :(得分:41)
第一个初始值设定项的正确签名是:
init(style style: UITableViewCellStyle, reuseIdentifier reuseIdentifier: String?)
请注意,reuseIdentifier
是Optional
,如?
所示。
如果您覆盖任何类的指定初始值设定项,则不会继承任何其他指定的初始值设定项。但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)