'required' initialisation init(coder:) "doit être fourni par la sous-classe de "UITableViewCell"

Ce code aurait travaillé ici et ici, mais je n'arrive pas à le faire fonctionner.

Les IBOutlets sont connectés à leurs objets dans le storyboard. Le prototypeCell est nommé afin que je puisse l'utiliser avec dequeueReusableCellWithIdentifier et son attribut de classe personnalisé est défini sur commentCell.

Première erreur (que je peux résoudre, mais aucun des liens ci-dessus n'en avait besoin, ce qui me fait penser que je fais quelque chose de mal. Suis-je le droit?):

Overriding method with selector 'initWithStyle:reuseIdentifier:' has incompatible type '(UITableViewCellStyle, String) -> commentCell'

Deuxième Erreur (l'intéressant erreur):

'required' initializer 'init(coder:)' must be provided by subclass of 'UITableViewCell'`

Code De Classe De Cellule:

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

Code D'initialisation:

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
}
25
demandé sur Community 2014-09-28 07:21:07

4 réponses

La signature correcte pour le premier initialiseur est la suivante:

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

Notez que les reuseIdentifier est un Optional, comme indiqué par la ?.

Si vous remplacez l'un des initialiseurs désignés d'une classe, vous n'héritez d'aucun autre initialiseur désigné. Mais UIView adopte le protocole NSCoding, qui nécessite un initialiseur init(coder:). Donc, vous devez implémenter celui-ci aussi:

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

Notez, cependant, que vous ne faites rien dans l'un ou l'autre initialiseur, sauf appeler super, si vous n'avez pas besoin d'implémenter un initialiseur! Si vous ne remplacez aucun initialiseur désigné, vous héritez de tous les initialiseurs désignés de votre superclasse.

Donc, mon conseil est que vous supprimez simplement votre initialiseur init(style:reuseIdentifier:) à moins que vous n'ajoutiez une initialisation.

Et si vous prévoyez d'y ajouter une initialisation, sachez que les cellules prototypes dans un storyboard sont pas initialisées par init(style:reuseIdentifier:). Ils sont initialisés par init(coder:).

41
répondu rob mayoff 2017-01-26 07:40:21

Vous ne savez pas pourquoi vous avez besoin d'une classe UITableViewCell personnalisée si vous utilisez storyboard avec une cellule prototype. Vous pouvez simplement déposer vos étiquettes et textviews dans la cellule et travailler avec eux.

Si vous travaillez à partir d'un xib alors je l'obtiens, mais vous avez seulement besoin de:

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

}

Vous enregistreriez alors le xib dans la classe TableView avec:

override func viewDidLoad() {
        super.viewDidLoad()

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

En ce qui concerne la fonction cellForRowAtIndexPath, la syntaxe est maintenant un peu modifiée:

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

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



        return cell
    }

Si vous souhaitez publier sur github, nous peut aider à faire des modifications. Il est difficile d'être précis sans voir plus de code.

2
répondu Steve Rosenberg 2014-09-28 03:52:04

La bonne façon d'hériter UITableViewCell dans Swift 4:

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

    required init?(coder aDecoder: NSCoder)
    {
        super.init(coder: aDecoder)
    }
}
1
répondu Vladimir Grigorov 2018-05-16 12:14:53

Swift 4

Implémentez le required init comme il le suggère, et ajoutez super.init(nibName: nil, bundle: nil) dans votre initialiseur personnalisé que vous ajoutez

Par exemple:

init(input: ProtocolType? = nil) {
        super.init(nibName: nil, bundle: nil)
        self.input = input
}

required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
}
0
répondu Naishta 2018-07-13 09:27:58