Подтвердить что ты не робот

'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
}
4b9b3361

Ответ 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, мы можем внести изменения. Трудно быть конкретным, не видя больше кода.