web-dev-qa-db-fra.com

'obligatoire' initialiseur 'init (codeur :)' doit être fourni par la sous-classe de 'UITableViewCell' "

Ce code aurait fonctionné 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. Ai-je raison?):

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

Deuxième erreur (l'erreur intéressante):

'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
}
26
User

La signature correcte pour le premier initialiseur est la suivante:

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

Notez que reuseIdentifier est une Optional, comme indiqué par le ?.

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

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

Notez cependant que vous ne faites réellement rien dans l'un des initialiseurs, si ce n'est que vous appelez super, vous n'avez donc pas besoin de les implémenter! Si vous ne remplacez aucun initialiseur désigné, vous héritez de tous les initialiseurs désignés de votre super-classe.

Je vous conseille donc de supprimer entièrement votre initialiseur init(style:reuseIdentifier:), à moins que vous n'y ajoutiez une initialisation.

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

41
rob mayoff

Vous ne savez pas pourquoi vous avez besoin d'une classe UITableViewCell personnalisée si vous utilisez le storyboard avec une cellule prototype. Vous pouvez simplement déposer vos étiquettes et vues de texte dans la cellule et les utiliser.

Si vous travaillez depuis un fichier xib, je l’ai, mais vous n’avez besoin que de:

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

}

Vous devriez alors enregistrer 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 pouvons vous aider à apporter des modifications. Il est difficile d'être précis sans voir plus de code.

2
Steve Rosenberg

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

Swift 4

Implémentez le required init comme il le suggère et ajoutez super.init(nibName: nil, bundle: nil) à 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
Naishta