我已在UITableViewController
中以编程方式创建viewDidLoad()
:
resultsController = UITableViewController(style: UITableViewStyle.plain)
resultsController.tableView.register(MyTableCellTableViewCell.self, forCellReuseIdentifier: "userFoundCell")
resultsController.tableView.dataSource = self
resultsController.tableView.delegate = self
然而,当我后来做
时override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
var cell: MyTableCellTableViewCell? = tableView.dequeueReusableCell(withIdentifier: "userFoundCell", for: indexPath) as? MyTableCellTableViewCell
if (cell == nil){
cell = MyTableCellTableViewCell(style: UITableViewCellStyle.default, reuseIdentifier: "userFoundCell")
}
cell!.lblTmp!.text = "test"
return cell!
}
cell
永远不会是零,我已经测试了它
代码崩溃:
致命错误:在展开Optional值时意外发现nil on cell!.lblTmp!.text =“test”
我的MyTableCellTableViewCell
看起来像这样
class MyTableCellTableViewCell: UITableViewCell {
@IBOutlet var lblTmp: UILabel!
override func awakeFromNib() {
super.awakeFromNib()
}
override func setSelected(_ selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
}
}
IBoutlet
在Interface Builder中连接到GUI元素。同一个班级也用在另一个地方。
答案 0 :(得分:5)
如果您的自定义tableview单元格包含xib和class,那么您应该按照以下方式注册您的单元格。
如果你有你的表视图单元格xib文件名,如“MyTableCellTableViewCell”,那么替换你的行
resultsController.tableView.register(MyTableCellTableViewCell.self, forCellReuseIdentifier: "userFoundCell")
这一行
resultsController.tableView.register(UINib(nibName: "MyTableCellTableViewCell", bundle: nil), forCellReuseIdentifier: "userFoundCell")
答案 1 :(得分:1)
这种创建细胞的模式是错误的:
if (cell == nil){
cell = MyTableCellTableViewCell(style: UITableViewCellStyle.default, reuseIdentifier: "userFoundCell")
}
你应该这样做(强迫使用!在我看来是合适的):
let cell = tableView.dequeueReusableCell(withIdentifier: "userFoundCell", for: indexPath) as! MyTableCellTableViewCell
如果此行崩溃,则表示您的自定义单元格未正确注册。这有助于您找出问题所在。
答案 2 :(得分:0)
虽然单元格不是零,但您似乎无法检查lblTmp
是否为零。如果lblTmp
为零,则尝试设置cell!.lblTmp!.text = "test"
将与unexpectedly found nil while unwrapping an Optional value
崩溃。您如何将lblTmp
设置为值?
答案 3 :(得分:0)
你不必解开cell!.lblTmp!.text = "test"
在声明一个隐式解包的可选@IBOutlet var lblTmp: UILabel!
改为使用cell!.lblTmp.text = "test"
。