我已经坚持这个问题好几天了,所以如果有人可以提供帮助,我真的很开心。 我正在尝试创建一个动态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
}
}
答案 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已经处理了这个问题。它也符合UITableViewDataSource
和UITableViewDataSource
,因此这些都是无关紧要的。
第四,不要设置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中的标识符。
答案 4 :(得分:1)
对于那些在尝试所有可能的解决方案后仍然想要解决这个问题的人:
断开/重新连接故事板中的IBOutlets应该可以解决问题!
答案 5 :(得分:0)
如果您将表格单元格与Xib一起使用。您需要向..
注册您的单元格register(_:forCellReuseIdentifier:)
答案 6 :(得分:0)
如果尚未为标签添加约束,则尽管已创建了自定义单元格,也不会创建约束。 确保添加了一些约束。
答案 7 :(得分:0)
别忘了添加:
tableView?.register(UINib(nibName: "xyz",
bundle: nil),
forCellReuseIdentifier: "abc")
答案 8 :(得分:0)