В моем 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
константа ограничения должна быть равна высоте метки веб-ссылки, если она ложна, она должна быть 0.
Моей первой мыслью было, что переработка представления UITableView может столкнуться с titleIndentationConstraint.constant = data.hasWeblink ? weblink.frame.height : 0
. Вот почему я позвонил setNeedsLayout()
и layoutIfNeeded()
сразу после этого, но, похоже, это не помогло. Все остальные элементы клетки выполняют свою работу правильно.
Также я устанавливаю tableView.rowHeight
и tableView.estimatedRowHeight
внутри viewDidLoad()
моего tableViewController.
У кого-нибудь есть идея, что, в частности, идет не так или что я забыл сделать? Спасибо вперед!