0

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

图片

这是我正在运行的应用程序:

图片

这是我的部分代码:

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方法查看是否显示内容,但我仍然得到与以前相同的错误。

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

4

1 回答 1

0

当您在故事板文件中配置自定义单元格时,您不需要调用register(_:forCellReuseIdentifier:),因为故事板应该已经为您完成了。

原因deleteButton是 nil 是因为通过像您一样重新注册单元类,您覆盖了情节提要为您注册的内容。通过使用该重用标识符出队创建的所有单元格将与情节提要无关,并且只是空的。

假设所有的@IBOutlets 和重用标识符和事物都已设置(你说你做了),然后简单地将具有在情节提要中设置的重用标识符的单元出列。

出列单元格示例:

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 中的单元格

为表格视图设置一个子类 子类在情节提要中设置为表视图

为第一个原型单元设置一个子类 子类设置为原型单元

为原型单元设置重用标识符 在此处输入图像描述

确保子视图(UIButton等)连接到属性@IBOutlet(子类代码如下所示) IB 插座设置为按钮,如单元格所示 IB Outlet 设置为按钮,如按钮所示

示例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!

}

结果:

显示单元子视图更改的模拟器屏幕截图

于 2018-05-22T13:03:38.190 回答