Swift自定义UITableViewCell标签总是为零

时间:2015-03-13 15:16:33

标签: ios iphone uitableview cocoa-touch swift

我已经坚持这个问题好几天了,所以如果有人可以提供帮助,我真的很开心。 我正在尝试创建一个动态UITableView,为此我创建了一个自定义UITableView子类,并且我也创建了一个自定义UITableViewCell子类,因为我需要在每个单元格中使用几个UILabel和一个UIButton。 单元格已创建,但问题是标签的值始终为零,因此单元格未正确显示。 This is,故事板的样子,以及this is我在运行程序时看到的内容。

这是我的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
    }
}

9 个答案:

答案 0 :(得分:47)

尝试删除self.table.registerClass(QuestionTableViewCell.self, forCellReuseIdentifier: "cell")

答案 1 :(得分:19)

如果您正在使用带有nib的单元格,请确保使用registerNib:forCellReuseIdentifier:在表格视图中注册单元格。如果单元格只有一个类,则使用registerClass:forCellReuseIdentifier:

答案 2 :(得分:6)

首先,如果在Interface Builder中存在类,则不必注册该类。

其次,您应该dequeueReusableCellWithIdentifier:forIndexPath而不是dequeueReusableCellWithIdentifier

第三,UITableViewController已经有一个名为tableView的属性,因此不需要将IBOutlet设置为table,因为UITableViewController已经处理了这个问题。它也符合UITableViewDataSourceUITableViewDataSource,因此这些都是无关紧要的。

第四,不要设置table的属性为tableView设置它们。

第五,cell.labDesk.text = ""就足够了,不需要让它可选。

如果所有的IBOutlet都已连接,单元格标识符正确设置,并且这些修订已经完成,它将起作用。

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

答案 3 :(得分:1)

我可能会迟到,但我刚刚解决了类似的问题。

确保您已在UITableViewCell上设置InterfaceBuilder中的标识符。

enter image description here

答案 4 :(得分:1)

对于那些在尝试所有可能的解决方案后仍然想要解决这个问题的人:

断开/重新连接故事板中的IBOutlets应该可以解决问题!

答案 5 :(得分:0)

如果您将表格单元格与Xib一起使用。您需要向..

注册您的单元格
register(_:forCellReuseIdentifier:)

答案 6 :(得分:0)

如果尚未为标签添加约束,则尽管已创建了自定义单元格,也不会创建约束。 确保添加了一些约束。

答案 7 :(得分:0)

别忘了添加:

tableView?.register(UINib(nibName: "xyz",
                           bundle: nil),
                    forCellReuseIdentifier: "abc")

答案 8 :(得分:0)

确保所选单元格在正确的“module”中,如有必要,继承:

enter image description here

否则,您的 IBOutlets 将为零。