web-dev-qa-db-fra.com

Simple UITableView dans Swift - trouvé de manière inattendue

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? 

13
soleil

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
7
Nate Cook

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.

70
mliu

J'obtenais cette erreur car je n'avais pas l'identifiant écrit dans le Storyboard de la cellule personnalisée. 

StoryBoard

Assurez-vous également qu'il correspond à votre code dans:

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

        let cell = tableView.dequeueReusableCellWithIdentifier("CustomTableCell") as CustomTableCell

        ...
    }
17
uplearnedu.com

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.

7
Hieu Vo

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")
3
Darius Miliauskas

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"). 

2
Alex Bailey

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)!
1
Dani.Rangelov

Je rencontre cette erreur si je mets UITapGestureRecognizer dans une UITableViewCell personnalisée sur le storyboard (la version Xcode est la 8.3).

0
Photon Point

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

0
Dania Delbani

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

0
Brigadier