'required' initializer 'init (coder:)' должен быть предоставлен подклассом 'UITableViewCell``
Этот код, как сообщается, работал здесь и здесь, но я могу " t, похоже, заставляет его работать.
IBOutlets подключаются к своим объектам в раскадровке.
ПрототипCell назван так, что я могу использовать его с dequeueReusableCellWithIdentifier
, а для атрибута custom class - 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
}
Ответы
Ответ 1
Правильная подпись для первого инициализатора такова:
init(style style: UITableViewCellStyle, reuseIdentifier reuseIdentifier: String?)
Обратите внимание, что reuseIdentifier
является Optional
, как указано ?
.
Если вы переопределите любой из инициализаторов класса, вы не наследуете никаких других назначенных инициализаторов. Но UIView
использует протокол NSCoding
, для которого требуется инициализатор init(coder:)
. Таким образом, вы тоже должны реализовать это:
init(coder decoder: NSCoder) {
super.init(coder: decoder)
}
Обратите внимание, однако, что вы на самом деле ничего не делаете в любом инициализаторе, кроме вызова супер, поэтому вам не нужно реализовывать либо инициализатор! Если вы не переопределите какие-либо назначенные инициализаторы, вы наследуете все инициализаторы, назначенные вашим суперклассам.
Итак, я советую вам просто удалить инициализатор init(style:reuseIdentifier:)
полностью, если вы не добавите к нему некоторую инициализацию.
И если вы планируете добавить к нему некоторую инициализацию, имейте в виду, что прототипные ячейки в раскадровке не инициализируются init(style:reuseIdentifier:)
. Они инициализируются init(coder:)
.
Ответ 2
Не уверен, почему вам нужен пользовательский класс UITableViewCell, если вы используете раскадровку с ячейкой прототипа. Вы можете просто поместить свои ярлыки и текстовые изображения в ячейку и работать с ними.
Если вы работаете с xib, я получаю его, но вам нужно только:
class commentCell: UITableViewCell {
@IBOutlet weak var authorLabel: UILabel!
@IBOutlet weak var commentLabel: UITextView!
}
Затем вы зарегистрировали xib в классе TableView с помощью:
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, мы можем внести изменения. Трудно быть конкретным, не видя больше кода.