Swift UITableViewCell 在 cellForRowAtIndexPath 之后无法设置其约束

Posted

技术标签:

【中文标题】Swift UITableViewCell 在 cellForRowAtIndexPath 之后无法设置其约束【英文标题】:Swift UITableViewCell fails to setup its constraint after cellForRowAtIndexPath 【发布时间】:2018-05-14 10:29:57 【问题描述】:

在我的 tableViewController 中,我使用了一个自定义单元格,其中包含一个 imageView、两个标签和一些其他不相关的元素。还有一个约束,如果给定特定条件,则必须更改其常数值。乍一看,这很好用,但是如果我向下滚动并获取约束常数设置为另一个值的单元格,则以下一些单元格会保持该常数与前一个单元格保持一致,并且不要在出现时设置它。

这是我的 cellForRowAtIndexpath 的相关部分:

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
    let identifier = whichCellToShow ? "ThisCell" : "TheOtherCellCell"

    //...

    let cell = tableView.dequeueReusableCell(withIdentifier: identifier, for: indexPath)

    if let customCell = cell as? CustomCellProtocol,
       indexPath.section < data.count,
       indexPath.row < data[indexPath.section].count 

        customCell.display(data: data[indexPath.section][indexPath.row])
    

    return cell

这些是我的自定义单元类的相关部分:

class CustomCell: UITableViewCell, CustomCellProtocol 
@IBOutlet weak var picture: UIImageView!
@IBOutlet weak var title: UILabel!
@IBOutlet weak var weblink: UILabel!
@IBOutlet weak var titleIndentationConstraint: NSLayoutConstraint!
//...

    func display(data: Data) 

        //...

        title.text = data.title

        //...

        weblink.text = data.hasWeblink ? URLUtilities.hostOfURL(urlstr: data.sourceUrl) : nil
        weblink.isHidden = !data.hasWeblink
        //This is the spot where things seem to go wrong
        titleIndentationConstraint.constant = data.hasWeblink ? weblink.frame.height : 0
        setNeedsLayout()
        layoutIfNeeded()
    

如果data.hasWeblink == true约束常数应该等于weblink标签的高度,如果它是假的应该是0。

我的第一个想法是,UITableView 的视图回收可能会与titleIndentationConstraint.constant = data.hasWeblink ? weblink.frame.height : 0 发生冲突。这就是为什么我之后打电话给setNeedsLayout()layoutIfNeeded(),但这似乎没有帮助。单元格的所有其他元素都正确地完成了它们的工作。

我还在 tableViewController 的 viewDidLoad() 内设置了 tableView.rowHeighttableView.estimatedRowHeight

有人知道那里出了什么问题或者我忘了做什么吗?谢谢转发!

【问题讨论】:

您是否在某处停用了约束? @bseh nope,在调试器中也没有收到约束中断警告,但我得到了另一个热门曲目,似乎标题标签的行为很愚蠢 【参考方案1】:

自己修好了,不得不更改标题标签的一些约束优先级:

我的标题标签有一个始终大于或等于 8 分的底部约束。此外,我将行数限制为 4,并告诉标签截断文本的尾部,如果它太长而无法显示。有趣的是,如果文本被截断,我就会得到上述这种愚蠢的行为,所以它与我的titleIndetantionConstraint 完全无关。似乎如果文本必须被截断,标签将自身与底部约束对齐,并且有点 拖动 将内容向左居中(所以请注意属性编辑器中 content mode 的内容,默认情况下应保留)。虽然更改标签的内容模式对我来说似乎是个坏主意,但我将标题标签底部约束的 priority 降低了 1,使其与图片顶部对齐,就像我计划的那样。希望这可以帮助人们遇到类似的问题 B)。

【讨论】:

你应该删除问题

以上是关于Swift UITableViewCell 在 cellForRowAtIndexPath 之后无法设置其约束的主要内容,如果未能解决你的问题,请参考以下文章

Swift3:UITableViewCell 和 UIButton - 通过单击 UIButton 显示和隐藏 UITableViewCell

Swift:在 UITableViewCell 中异步加载图像 - 自动布局问题

在嵌入在 UITableviewCell 中的 UICollectionView 中进行 Segue,Swift

Swift:选择 UICollectionViewCell(在 UITableViewCell 内)时如何使用 Segue

Swift交替UITableViewCell渐变颜色

UITableViewCell中的Swift ScrollView不滚动