Быстрая пользовательская метка UITableViewCell всегда равна нулю

Я застрял в этой проблеме в течение нескольких дней, поэтому я был бы очень рад, если бы кто-то мог помочь. Я пытаюсь создать динамический UITableView, для которого я создал пользовательский подкласс UITableView, и я создал собственный подкласс UITableViewCell, так как мне нужно несколько UILabels и UIButton в каждой ячейке. Ячейка создана, но проблема в том, что значение меток всегда равно nil, поэтому ячейка отображается неправильно. Вот как выглядит раскадровка, и это то, что я вижу при запуске программы.

Здесь мой подкласс UITableViewCell:

import UIKit

class QuestionTableViewCell: UITableViewCell {

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

}

и мой подкласс 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
    }
}

Ответ 1

Попробуйте удалить self.table.registerClass(QuestionTableViewCell.self, forCellReuseIdentifier: "cell")

Ответ 2

Если вы используете ячейку с наконечником, убедитесь, что вы регистрируете ячейку с табличным представлением с помощью registerNib:forCellReuseIdentifier: Если ячейка имеет класс, то используйте registerClass:forCellReuseIdentifier:

Ответ 3

Во-первых, вам не нужно регистрировать класс, если он существует в Interface Builder.

Во-вторых, вы должны dequeueReusableCellWithIdentifier:forIndexPath вместо dequeueReusableCellWithIdentifier.

В-третьих, UITableViewController уже имеет свойство tableView поэтому нет необходимости делать IBOutlet для table поскольку UITableViewController уже обрабатывает это. Он также соответствует UITableViewDataSource и UITableViewDataSource поэтому они являются посторонними.

В-четвертых, не устанавливайте свойства table для их table для tableView.

В-пятых, cell.labDesk.text = "" достаточно, не нужно делать его необязательным.

Если все ваши IBOutlets подключены, идентификаторы ячеек правильно установлены, и эти изменения будут выполнены, он будет работать.

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
    }
}

Ответ 4

Для тех, кто все еще пытается понять это, пробовав все эти возможные решения:

Отсоединить/Подсоединить IBOutlets в ваших раскадровки, нужно сделать трюк!

Ответ 5

Возможно, я опаздываю, но я решил проблему с аналогичными проблемами.

Убедитесь, что вы установили идентификатор в InterfaceBuilder на свой UITableViewCell.

enter image description here