如何将子视图添加到所有 UITable 单元格

How to add a subView to all UITable Cells

不使用故事板。

我正在尝试向任何未填充值的单元格添加错误标签 out/saved。我得出结论,我不需要显示此逻辑,问题是在 all/more 中显示的错误标签多于一个 tableView 的单元格。

我创建了这个 viewLabel 以供重复使用:

struct Label {
    static let errorLabel: UILabel = {
        let label = UILabel()
        label.frame = CGRect(x: 0, y: 0, width: 18, height: 18)
        label.text = "!"
        label.layer.cornerRadius = label.frame.height / 2
        label.backgroundColor = UIColor.red
        label.translatesAutoresizingMaskIntoConstraints = false
        label.textAlignment = .center
        label.textColor = UIColor.white
        label.font = UIFont(name: "CircularStd-Black", size: 14)
        label.clipsToBounds = true
        return label
    }()
}

cellForRowAt 内部:

// I'm using detailTextLabel
let cell = UITableViewCell(style: .value1, reuseIdentifier: cellId)
cell.addSubview(Label.errorLabel)
// [...] constraints for Label.errorLabel
return cell

基于此示例,我希望在所有单元格上显示一个红色圆圈,但它却显示在最后一个单元格上。为什么?

这里有一些错误:

  1. 您应该只添加到单元格 contentView。 (https://developer.apple.com/documentation/uikit/uitableviewcell/1623229-contentview)

示例:

cell.contentView.addSubview(myLabel)
  1. 更好的重用是添加您的标签一次。 这可以在界面构建器或 init 或 awakeFromNib 中完成。这样复用效率会更高

  2. 这是您遇到的主要问题

您正在一次又一次地添加 一个 静态标签。

意思:只有最后一个单元格会显示它,因为只有一个标签(:

最好使用函数创建标签(工厂函数)

static func createLabel() -> UILabel {
  let label = UILabel()
        label.frame = CGRect(x: 0, y: 0, width: 18, height: 18)
        label.text = "!"
        label.layer.cornerRadius = label.frame.height / 2
        label.backgroundColor = UIColor.red
        label.translatesAutoresizingMaskIntoConstraints = false
        label.textAlignment = .center
        label.textColor = UIColor.white
        label.font = UIFont(name: "CircularStd-Black", size: 14)
        label.clipsToBounds = true
        return label
}