UITableView dequeueReusableCell дублирует ограничения - PullRequest
0 голосов
/ 30 июня 2019

Используя swift, у меня есть UITableView и кастом UITableViewCells. После инициализации каждой ячейки я вызываю метод (layoutViews()) для применения соответствующих ограничений (NSLayoutConstraint.activate([...]). Одно ограничение, метка, ведущая привязка, является динамическим на основе строки и приводит к некоторому отступу между родительскими и дочерними записями.

Пример:

Parent
    Child
Parent
Parent
    Child
        Grandchild
    Child
    Child

При прокрутке ограничения запутываются и приводят к дублированию ограничений в одной и той же ячейке

Ошибка: невозможно одновременно удовлетворить ограничения ... Попытка восстановления путем нарушения ограничения).

В большинстве случаев отступы не выполняются, когда это должно быть.

Я попытался деактивировать предыдущие ограничения, удалить предыдущие ограничения и удалить все представления из суперпредставления. Я получил разные результаты, но ни один из них не был правильным.

Я просто хочу, чтобы отступ совпадал со значением CGFloat, которое я предоставляю в функции getIndentaion().

По запросу, вот соответствующий код (сокращенная форма, конечно).

В UIViewController:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! CustomCell
    cell.setIndentation(2)
    cell.layoutViews()
    return cell
}

В пользовательской ячейке:

func getIndentation() -> CGFloat {
    return 5 + ((indentation ?? 0) * 15)
}

func layoutViews() {
    NSLayoutConstraint.activate([
        messageLabel.leadingAnchor.constraint(equalTo: messageBackground.leadingAnchor, constant: getIndentation())
    ])
}

Любая помощь приветствуется.

1 Ответ

0 голосов
/ 30 июня 2019

Спасибо, @ Paulw11. Сработало следующее решение:

В UIViewController:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! CustomCell
    cell.setIndentation(2)
    return cell
}

В пользовательской ячейке:

var indentationConstraint: NSLayoutConstraint!

func layoutViews() {
    indentationConstraint = messageLabel.leadingAnchor.constraint(equalTo: messageBackground.leadingAnchor, constant: 5)

    NSLayoutConstraint.activate([
        indentationConstraint
        ])
    }
}

func setIndentation(_ indentation: CGFloat) {
    let totalIndentation: CGFloat = 5 + (indentation * 15)
    indentationConstraint.constant = totalIndentation
    messageLabel.layoutIfNeeded()
}
...