web-dev-qa-db-fra.com

Cellule de vue de tableau personnalisée: le libellé IBOutlet est nul

Considérez le contrôleur de vue simple suivant:

class ViewController: UIViewController, UITableViewDataSource {
    @IBOutlet weak var tableView: UITableView!

    var items = ["One", "Two", "Three"]

    override func viewDidLoad() {
        super.viewDidLoad()

        self.tableView.registerClass(CustomTableViewCell.self, forCellReuseIdentifier: "customCell")
        self.tableView.dataSource = self
    }

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return self.items.count;
    }

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = self.tableView.dequeueReusableCellWithIdentifier("customCell") as CustomTableViewCell
        cell.titleLabel!.text = self.items[indexPath.row]
        return cell
    }
}

Et vue de cellule personnalisée:

class CustomTableViewCell: UITableViewCell {
    @IBOutlet weak var titleLabel: UILabel!   
}

Ce code provoque l'erreur suivante.

erreur fatale: trouvé de manière inattendue nil lors du déroulement d'une valeur facultative

titleLabel est nul - on ne sait pas pourquoi. La définition des propriétés par défaut de UITableViewCell (comme textLabel) fonctionne parfaitement.

J'utilise une plume pour la cellule personnalisée.

Les étiquettes et les vues de table sont correctement connectées à leur IBOutlets.

labeltable view

La cellule prototype et la vue nib personnalisée sont marquées comme ayant une classe CustomTableViewCell.

Je suis nouveau dans le développement iOS, est-ce qu'il me manque quelque chose d'évident?

Exemple de projet Xcode disponible .

45
David Chouinard

Tout d’abord, vous utilisez un fichier nib pour charger votre cellule personnalisée dans le tableau. Cela va probablement causer plus de maux de tête que ça vaut la peine si vous débutez dans Swift/Cocoa. Pour le moment, je mettrais tout en place dans le scénarimage. Au lieu d'utiliser un fichier nib, cliquez sur, allez dans Storyboard, cliquez sur votre UITableView et assurez-vous que le paramètre de contenu de TableView est Dyanamic Prototypes:

enter image description here

Ensuite, cliquez sur la cellule prototype (la seule de la vue tableau), définissez la classe sur CustomTableViewCell et définissez son identificateur de réutilisation sur customCell:

enter image description hereenter image description here

Ensuite, ajoutez une étiquette à votre cellule prototype et reliez-la à IBOutlet dans votre classe CustomTableViewCell. Vous n'avez pas besoin d'enregistrer votre customCell tant que vous avez défini l'identifiant de réutilisation dans le storyboard. Supprimer cette ligne:

self.tableView.registerClass(CustomTableViewCell.self, forCellReuseIdentifier: "customCell")

et ça devrait fonctionner.

48
kellanburket

essaye ça

import UIKit

class ViewController: UIViewController, UITableViewDataSource {
    @IBOutlet weak var tableView: UITableView!

    var items = ["One", "Two", "Three"]

    override func viewDidLoad() {
        super.viewDidLoad()

        self.tableView.registerNib(UINib(nibName: "CustomTableViewCell", bundle: nil), forCellReuseIdentifier: "customCell")// CustomTableViewCell.self, forCellReuseIdentifier: "customCell")
        self.tableView.dataSource = self
    }

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return self.items.count;
    }

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = self.tableView.dequeueReusableCellWithIdentifier("customCell", forIndexPath: indexPath) as CustomTableViewCell
        cell.titleLabel!.text = self.items[indexPath.row]
        return cell
    }
}
38
LDNZh

Enregistrez votre nib comme ceci:

let bundle = Bundle(for: type(of: self))
let nib = UINib(nibName: "PickerCell", bundle: bundle)
collectionViewPicker.register(nib, forCellWithReuseIdentifier: "cell")
8
Arnav

Tu devrais utiliser dequeueReusableCellWithIdentifier:forIndexPath pour retirer les cellules.

Si vous utilisez le storyboard pour créer les cellules, vous ne devriez pas avoir besoin d'enregistrer la classe pour la réutiliser, car le storyboard le fait pour vous si vous définissez le paramètre reuseIdentifier.

7
Rory McKinnel

Assurez-vous de ne commettre aucune erreur en enregistrant votre nib (cellule personnalisée) dans le viewdidload. Le nom de la partition et les identificateurs de réutilisation ne doivent pas être erronés.

1