'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
}
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:)
.
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.
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)
}
}
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")
}