【问题标题】:Why is my custom UITableViewCell showing not displaying properly?为什么我的自定义 UITableViewCell 显示不正确?
【发布时间】:2019-05-09 23:34:10
【问题描述】:

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

我检查了以下几点:

  • TableViewController 的 Class 设置为我的 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 个空单元格,我可以看到这些单元格在那里,因为如果我点击它们,它们可以被选中。

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

【问题讨论】:

  • 您是否尝试过在 Xcode 中调试视图层次结构,请参阅developer.apple.com/library/archive/documentation/…
  • 为标签和文本字段分配默认值。单元格仍然是空的吗?顺便说一句,如果使用相同的 identifiercellForRow 中的 switch 毫无意义。当您要将值分配给自定义 IBOutlets 时,代码会在 > 0 部分崩溃。你必须实例化视图控制器。默认初始化程序ControlSettingsView() 不会返回情节提要中的控制器。最后,如果单元格是在 Interface Builder 的目标表视图中设计的,则您必须注册单元格。

标签: ios swift uitableview


【解决方案1】:

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

let v = ControlSettingsView()

因此原型单元格属性将为 nil。使用故事板标识符创建视图控制器实例

确保您已为视图控制器设置故事板标识符 ControlSettingsView

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

如果情节提要中有表格视图单元格,请不要使用register(_:forCellReuseIdentifier:) 方法。

【讨论】:

  • 这解决了这个问题,谢谢,但我还必须从我的 viewDidLoad 中删除行 ``` tableView.register(InputCell.self, forCellReuseIdentifier: INPUT_CELL)```。我不知道您必须从情节提要中加载视图,以为在我的脑海中实例化类就足够了。
  • @Chip 是的。仅当表格视图单元格是在没有 iboutlets 的情况下以编程方式创建时才应使用 tableView.register
【解决方案2】:

因为您没有为单元格设置任何属性,所以除了一个空单元格之外什么都没有显示。考虑以下代码:

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"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-13
    • 2016-10-02
    • 1970-01-01
    • 2018-05-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多