表格视图单元格中的堆栈视图

Posted

技术标签:

【中文标题】表格视图单元格中的堆栈视图【英文标题】:Stack View in a table view cell 【发布时间】:2016-09-23 12:02:48 【问题描述】:

我正在尝试以编程方式在表格视图单元格中实现堆栈视图,并向其添加标签和按钮,如下所示:

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
    let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
    let dict = self.char[indexPath.row]
    let stackView = UIStackView()
    stackView.translatesAutoresizingMaskIntoConstraints = false
    stackView.axis = .horizontal
    stackView.spacing = 20
    stackView.distribution = .fillProportionally
    stackView.alignment = .leading
    cell.addSubview(stackView)
    NSLayoutConstraint.activate([
        stackView.leadingAnchor.constraint(equalTo: cell.leadingAnchor),
        stackView.trailingAnchor.constraint(equalTo: cell.trailingAnchor)
        ])
    let bornLabel = UILabel()
    bornLabel.textColor = UIColor.blue
    let bornLabelValue = UILabel()
    bornLabelValue.textColor = UIColor.blue
    stackView.addArrangedSubview(bornLabel)
    stackView.addArrangedSubview(bornLabelValue)
    for (key, value) in dict 
        bornLabel.text = key
        bornLabelValue.text = value
        if key == "Height" 
            let button = UIButton(type: .roundedRect)
            button.setTitle("English", for: .normal)
            button.setTitleColor(.blue, for: .normal)
         stackView.addArrangedSubview(button)
        
    
    return cell

问题在于,每次调用tableView.reloadData() 时,都会在现有单元格的顶部添加另一个单元格,根据提供给tableView 的数据,每个标签具有不同的值。或者它可能不会每次都生成另一个单元格,而只是添加另一个堆栈视图。我不知道。我该如何解决这个问题?

谢谢

【问题讨论】:

【参考方案1】:

问题是你得到了一个“可重复使用的单元格”,这意味着前几次它会是一个空单元格,然后它会是你已经添加的单元格UIStackView

您应该通过Storyboard 或新的XIB 文件创建一个新的原型单元,在其中添加UIStackView,然后只在cellForRowAt indexPath: 实现中配置该stackView。

或者从技术上讲,您可以在 stackView 中设置一个标签,然后检查该标签的单元格……但请不要这样做。

【讨论】:

您的回答让我找到了正确的地方,谢谢。我通过确实使用原型单元来解决它,向其中添加一个堆栈视图并在cellForRowAt indexPath: 中配置该堆栈视图。我之前已经尝试过,并且也在cellForRowAt indexPath: 中实例化了我的标签和按钮,而不是在我的自定义单元格类中,现在可以完美运行。谢谢! 我如何配置堆栈视图,你会详细说明吗? 参见 OP 原始示例的第 5 行到第 9 行。如果您需要更多帮助,您应该考虑提出一个新问题:***.com/questions/ask【参考方案2】:

尝试在cell.contentView

中添加stackView

我是 Objective-C 的人,所以还没有学会 swift。

在 Objective C 中,我们在实例化之前检查 cell 是否为 nil 的条件。

例如

if(cell == nil)

   # Instantiate cell here

此单元格不会为 indexPath 的每一行实例化。

【讨论】:

以上是关于表格视图单元格中的堆栈视图的主要内容,如果未能解决你的问题,请参考以下文章

表格视图不显示单元格中的内容

如何从表格视图中的选定单元格中获取文本?

表格视图单元格中的标签和文本字段之间的空间相等。

如何使用自动布局来调整表格视图单元格中的视图?

如何让单元格中的内容视图占据整个单元格?

表格视图单元格中的集合视图