使用用户定义的单元格以编程方式创建UITableViewController

时间:2017-05-06 18:32:08

标签: ios swift uitableview

我已在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元素。同一个班级也用在另一个地方。

4 个答案:

答案 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"