Code assez simple:
func numberOfSectionsInTableView(tableView: UITableView?) -> Int {
return 1
}
func tableView(tableView:UITableView!, numberOfRowsInSection section:Int) -> Int {
return 5
}
func tableView(tableView:UITableView!, cellForRowAtIndexPath indexPath:NSIndexPath!) -> UITableViewCell! {
let cell: BookTableViewCell = BookTableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: "BookCell")
println("ip: \(indexPath.row)")
cell.bookLabel.text = "test"
return cell
}
Sur la ligne cell.bookLabel.text, j'obtiens ceci:
fatal error: unexpectedly found nil while unwrapping an Optional value
Le BookTableViewCell est défini comme ceci:
class BookTableViewCell: UITableViewCell {
@IBOutlet var bookLabel: UILabel
override func awakeFromNib() {
super.awakeFromNib()
// Initialization code
}
override func setSelected(selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
// Configure the view for the selected state
}
}
Et bookLabel est correctement connecté à une cellule Prototype dans le Storyboard. Pourquoi est-ce que je reçois cette erreur?
Lorsque vous créez une vue dans le code, ses propriétés IBOutlet
ne sont pas correctement connectées. Vous voulez la version que vous avez obtenue de dequeueReusableCellWithIdentifier
:
let cell = tableView.dequeueReusableCellWithIdentifier("BookCell") as BookTableViewCell
Si vous utilisez le storyboard, assurez-vous de ne pas avoir cette ligne au début de votre fichier:
self.tableView.registerClass(CustomTableViewCell.self, forCellReuseIdentifier: "customCell")
Cela écrasera le storyboard et, par conséquent, les liens de sortie du storyboard seront ignorés.
J'obtenais cette erreur car je n'avais pas l'identifiant écrit dans le Storyboard de la cellule personnalisée.
Assurez-vous également qu'il correspond à votre code dans:
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
{
let cell = tableView.dequeueReusableCellWithIdentifier("CustomTableCell") as CustomTableCell
...
}
Peut-être que votre vue dans Main.Storyboard a perdu sa référence IBOutlet dans le fichier ViewController, il suffit de la lier à nouveau.
N'oubliez pas d'enregistrer votre nib (testé avec Swift3), e. g. inside override func viewDidLoad () :
self.tableView.register(UINib(nibName: "BookTableViewCell", bundle: nil), forCellReuseIdentifier: "BookCell")
La raison pour laquelle cette question est souvent posée est qu'elle dépend de la manière dont vous configurez votre vue de table et votre CellClass personnalisée. Créez-vous votre tableview dans le storyboard ou par programme? Créez-vous des cellules .xib personnalisées et des classes de cellules personnalisées?
Si vous avez créé votre tableview par programme et créé des classes .xib et Cell personnalisées, voici la réponse pour Swift 4 :
in viewDidLoad:
customTable.register(UINib(nibName: "NibName", bundle: nil), forCellReuseIdentifier: "NibNameIdentifier")
in cellforRowat:
let cell = tableView.dequeueReusableCell(withIdentifier: "NibName") as! ClassName
Remarque: Dans votre fichier .xib de cellule, veillez à définir votre identifiant dans l'inspecteur Attributs ("NibNameIdentifier").
Dans mon cas, c’est la façon dont l’Option facultative est déballée:
let cellId:String = "ConverterTableCell"
let cell: ConverterTableViewCell = (tableView.dequeueReusableCellWithIdentifier(cellId)! as? ConverterTableViewCell)!
Je rencontre cette erreur si je mets UITapGestureRecognizer dans une UITableViewCell personnalisée sur le storyboard (la version Xcode est la 8.3).
Je reçois cette erreur chaque fois que j'utilise réutilise Identifiant nom différent du nom de classe personnalisé Unified ces noms le résolvent pour moi
Essayez de faire ceci:
let cell = tableView.dequeueReusableCellWithIdentifier("BookCell", forIndexPath: indexPath) as! BookTableViewCell
et n'oubliez pas de définir l'identifiant de réutilisation dans votre storyboard