web-dev-qa-db-fra.com

L'étiquette UITableViewCell personnalisée Swift est toujours nulle

Cela fait des jours que je suis coincé dans ce problème, je serais donc très heureux si quelqu'un pouvait m'aider. J'essaie de créer un UITableView dynamique, pour lequel j'ai créé une sous-classe UITableView personnalisée et j'ai a également créé une sous-classe UITableViewCell personnalisée, car il me faut plusieurs étiquettes UIL et un bouton UIButton dans chaque cellule. La cellule est créée, mais le problème est que la valeur des étiquettes est toujours nulle. affiché correctement. C’est , à quoi ressemble le storyboard, et c’est ce que je vois pendant l’exécution du programme.

Voici ma sous-classe UITableViewCell:

import UIKit

class QuestionTableViewCell: UITableViewCell {

    @IBOutlet var student: UILabel!
    @IBOutlet var labDesk: UILabel!
    @IBOutlet var topic: UILabel!
    @IBOutlet var answers: UILabel!

}

et ma sous-classe UITableView:

import UIKit

class QuestionViewController: UITableViewController, UITableViewDelegate, UITableViewDataSource {

    @IBOutlet var table: UITableView!
     struct Question {
        var student: String
        var labDesk: String
        var topic: String
        var answered: String
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        table.estimatedRowHeight = 50
        table.dataSource = self
        table.delegate = self
        self.table.registerClass(QuestionTableViewCell.self, forCellReuseIdentifier: "cell")
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }

    override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        return 1
    }

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 1
    }

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier("cell") as QuestionTableViewCell
        cell.student.text = "random string"
        cell.labDesk?.text = "25/A"
        cell.topic?.text = "string"
        cell.answers?.text = "3"
        return cell
    }
}
15
Dávid Pásztor

Essayez de supprimer self.table.registerClass(QuestionTableViewCell.self, forCellReuseIdentifier: "cell")

43
Badie

Si vous utilisez une cellule avec un nib, assurez-vous que vous enregistrez la cellule avec la vue tableau à l'aide de registerNib:forCellReuseIdentifier:. Si la cellule a juste une classe, utilisez registerClass:forCellReuseIdentifier:.

18
Nick Venn

Tout d'abord, vous n'avez pas besoin d'enregistrer la classe si elle existe dans Interface Builder.

Deuxièmement, vous devriez dequeueReusableCellWithIdentifier:forIndexPath au lieu de dequeueReusableCellWithIdentifier.

Troisièmement, UITableViewController a déjà une propriété appelée tableView, il n’est donc pas nécessaire de définir un IBOutlet sur table car UITableViewController le gère déjà. Il est également conforme à la UITableViewDataSource et à la UITableViewDataSource, elles sont donc superflues.

Quatrièmement, ne définissez pas les propriétés pour table, définissez-les pour tableView.

Cinquièmement, cell.labDesk.text = "" est suffisant, inutile de le rendre facultatif.

Si tous vos IBOutlets sont connectés, que les identificateurs de cellule sont correctement définis et que ces révisions sont effectuées, cela fonctionnera.

class QuestionTableViewCell: UITableViewCell {

    @IBOutlet var student: UILabel!
    @IBOutlet var labDesk: UILabel!
    @IBOutlet var topic: UILabel!
    @IBOutlet var answers: UILabel!

}


class QuestionViewController: UITableViewController {

    struct Question {
        var student: String
        var labDesk: String
        var topic: String
        var answered: String
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        tableView.estimatedRowHeight = 50
        tableView.dataSource = self
        tableView.delegate = self
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }

    override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        return 1
    }

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 1
    }

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier("Cell") as QuestionTableViewCell
        cell.student.text = "random string"
        cell.labDesk.text = "25/A"
        cell.topic.text = "string"
        cell.answers.text = "3"
        return cell
    }
}
5
Ian

Pour ceux qui essaient encore de comprendre cela après avoir essayé toutes les solutions possibles:

Déconnecter/Reconnecter les IBOutlets de vos Storyboards devrait faire l'affaire!

1
Jason LAPIERRE

Je suis peut-être en retard ici, mais je viens de résoudre un problème similaire.

Assurez-vous que vous avez défini l'identifiant dans InterfaceBuilder sur votre UITableViewCell.

enter image description here

0
Eric Conner