内容视图不会显示在UITableViewCell

时间:2018-05-22 01:34:29

标签: ios swift uitableview cell viewwithtag

这是我的故事板的一部分:

Image

这是我正在运行的应用:

Image

这是我的代码部分:

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        if indexPath.section == 0 {
            if indexPath.row == 0 {
                 return super.tableView(tableView, cellForRowAt: indexPath)
            } else {
                tableView.register(SubTextFieldCell.self, forCellReuseIdentifier: "SubTextFieldCell")
                let cell = tableView.dequeueReusableCell(withIdentifier: "SubTextFieldCell", for: indexPath) as! SubTextFieldCell

//                cell.deleteButton.isEnabled = true
//                cell.subTextfield.text = "OK"

                print("indexPath.row: \(indexPath.row)")

                return cell
            }
...

我已经在各个地方连接了按钮和文本字段,我可以保证这部分没有错,但是当我点击第一行中的“添加”按钮时,我只得到一个没有任何内容的单元格。

如果我使用像cell.deleteButton...这样的代码,Xcode会报告错误:

  

线程1:致命错误:在展开时出乎意料地发现nil   可选值

然后我尝试使用viewWithTag方法查看是否显示内容,但我仍然遇到与以前相同的错误。

这是我第一次遇到这种错误。我的其他程序中的代码和方法没有错误。

1 个答案:

答案 0 :(得分:0)

在情节提要文件中配置自定义单元格时,您不需要致电register(_:forCellReuseIdentifier:),因为故事板应该为您完成。

deleteButton为零的原因是因为通过重新注册单元格类,您覆盖了为您注册的故事板。通过使用该重用标识符出列而创建的所有单元格都不会与故事板连接,只是为空。

假设所有@IBOutlet和重用标识符和事物都已设置(你说你做了),那么只需使用故事板中设置的重用标识符将单元格出列。

出列单元格示例:

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    if indexPath.section == 0 {
        if indexPath.row == 0 {
            return super.tableView(tableView, cellForRowAt: indexPath)
        } else {
            // Registering again is unnecessary, because the storyboard should have already done that.
//            tableView.register(SubTextFieldCell.self, forCellReuseIdentifier: "SubTextFieldCell")
            let cell = tableView.dequeueReusableCell(withIdentifier: "SubTextFieldCell") as! SubTextFieldCell

            cell.deleteButton.isEnabled = true
            cell.subTextfield.text = "OK"

            return cell
        }
    } else {
        ...
    }
}

注意:

即使在您需要使用表视图注册类的情况下,您也只需要执行一次。 (例如,在viewDidLoad期间)

即使在那些时候,每次出列单元格时,都不应该>调用它。您只是让您的应用更加努力。

将视图连接到Storyboard中的单元格

将子类设置为表视图 Subclass set to Table View in Storyboard

将子类设置为第一个原型单元格 Subclass set to prototype cell

将重用标识符设置为原型单元格 enter image description here

确保子视图(UIButton等)与@IBOutlet的属性相关联(子类代码如下所示) IB Outlet set to button, as seen by cell IB Outlet set to button, as seen by button

示例UITableViewController子类:

class MyTableViewController: UITableViewController {

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 2
    }

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        if indexPath.row == 0 {
            let cell = tableView.dequeueReusableCell(withIdentifier: "MyFirstCell", for: indexPath) as! MyFirstTableViewCell

            // Configure cell if needed
            cell.myButton.setTitle("New Button Text", for: .normal)
            cell.myButton.tintColor = .green

            return cell
        } else {
            let cell = tableView.dequeueReusableCell(withIdentifier: "MySecondCell", for: indexPath) as! MySecondTableViewCell

            // Configure cell if needed
            cell.myTextField.backgroundColor = .red

            return cell
        }
    }

}

示例UITableViewCell子类:

class MyFirstTableViewCell: UITableViewCell {

    @IBOutlet weak var myButton: UIButton!

}

结果:

Simulator screenshot showing changes to cell subviews