为什么我的自定义UITableViewCell无法正确显示?

时间:2019-05-09 15:13:56

标签: ios swift uitableview

我有一个带有单个原型单元的UITableViewController。单元格中有一个标签和一个文本字段,并且其类设置为InputCell。加载表格视图时,该单元似乎已出队,但显示为默认的空单元。

我检查了以下内容:

  • TableViewController的类设置为我的TableViewController子类(ControlSettingsView)
  • TableViewController是TableView的委托和数据源
  • 自定义单元格的类设置为我的TableViewCell子类(InputCell)
  • 自定义单元格重用标识符设置为“ input_cell”,它与我的TableViewController中使用的标识符匹配。
  • 确保标签和文本字段位于我的单元格内容视图中,而不是单元格本身。
  • 单元格中视图的约束看起来很明智。
  • 将单元格背景设置为红色以突出显示,以检查标签和文本字段是否不可见,但单元格已正确出队。

从根视图控制器导航到我的设置视图的功能

func gototSettingsFor(control: EditableUIElement) {
        let v = ControlSettingsView()
        self.navigationController?.pushViewController(v, animated: true)
    }

ControlSettingsView.swift

class ControlSettingsView: UITableViewController {

    let INPUT_CELL: String = "input_cell"

    override func viewDidLoad() {
        super.viewDidLoad()
        tableView.register(InputCell.self, forCellReuseIdentifier: INPUT_CELL)
    }

    override func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        switch (section) {
        case 0:
            return 5
        default:
            return 0
        }
    }


    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        switch (indexPath.section) {
        case 0:
            let cell: InputCell = tableView.dequeueReusableCell(withIdentifier: INPUT_CELL, for: indexPath) as! InputCell
            return cell
        default:
            return tableView.dequeueReusableCell(withIdentifier: INPUT_CELL, for: indexPath)
        }
    }
}

InputCell.swift

class InputCell: UITableViewCell {

    @IBOutlet weak var cell_input: UITextField!
    @IBOutlet weak var cell_title: UILabel!

}

我希望在表格视图中显示5个自定义表格视图单元格,但是我只有5个空单元格,我可以看到那里的单元格,因为如果我点击它们,就可以选择它们。

我无法理解为什么该单元格不是自定义单元格而是空单元格。

2 个答案:

答案 0 :(得分:4)

情节提要中有表格视图控制器和原型单元。但是您正在以编程方式创建视图控制器

let v = ControlSettingsView()

因此原型单元的属性将为零。使用情节提要标识符创建视图控制器实例

确保已为视图控制器设置情节提要标识符ControlSettingsView

if let vc = self.storyboard?.instantiateViewController(withIdentifier: "ControlSettingsView") as? ControlSettingsView {
    self.navigationController?.pushViewController(vc, animated: true)
}

如果故事板中有表格视图单元,则不要使用register(_:forCellReuseIdentifier:)方法。

答案 1 :(得分:0)

因为您尚未设置单元格的任何属性,所以除了空白单元格之外,什么都不会显示。考虑以下代码:

let cell: InputCell = tableView.dequeueReusableCell(withIdentifier: INPUT_CELL, for: indexPath) as! InputCell
return cell

您现在正在做什么::您当前正在获得一个已出队的单元格,并返回它。但是,您尚未设置任何单元格属性。

您需要做什么:您需要设置一些属性,例如文本或图像,如下所示:

cell.textLabel = "MY TEXT HERE"

或者,根据您的自定义InputCell,您可以这样做:

cell.cell_title = "MY TEXT HERE"