Добавление ограничений на существующий textLabel в пользовательском UITableViewHeaderFooterView - PullRequest
0 голосов
/ 08 июля 2019

Я хотел добавить простой счетчик количества объектов в таблице в заголовке таблицы рядом с ее textLabel. Итак, я создал этот класс:

import UIKit

class CounterHeaderView: UITableViewHeaderFooterView {
    static let reuseIdentifier: String = String(describing: self)

    var counterLabel: UILabel

    override init(reuseIdentifier: String?) {
        counterLabel = UILabel()
        super.init(reuseIdentifier: reuseIdentifier)

        contentView.addSubview(counterLabel)

        counterLabel.translatesAutoresizingMaskIntoConstraints = false
        counterLabel.backgroundColor = .red

        if let textLabel = self.textLabel{
            counterLabel.leadingAnchor.constraint(equalTo: textLabel.trailingAnchor, constant: 6.0).isActive = true
            counterLabel.topAnchor.constraint(equalTo: textLabel.topAnchor).isActive = true
            counterLabel.heightAnchor.constraint(equalToConstant: 24.0).isActive = true
        }

    }

    required init?(coder aDecoder: NSCoder) {
        counterLabel = UILabel()
        super.init(coder: aDecoder)
    }
}

Но выполнение этого приводит к следующей ошибке:

'Unable to activate constraint with anchors 
<NSLayoutXAxisAnchor:0x60000388ae00 "UILabel:0x7fb8314710a0.leading"> 
and <NSLayoutXAxisAnchor:0x60000388ae80 "_UITableViewHeaderFooterViewLabel:0x7fb8314718c0.trailing"> 
because they have no common ancestor.  
Does the constraint or its anchors reference items in different view hierarchies?  
That's illegal.'

Как я могу добавить ограничение для своего counterLabel на основе уже существующего textLabel? Разве textLabel уже не является представлением ContentView?

1 Ответ

0 голосов
/ 08 июля 2019

Вы пытаетесь использовать встроенный textLabel, который, я уверен, недоступен во время init. Попробуйте выполнить код макета внутри метода layoutSubviews сразу после вызова super. Этот метод может быть оценен пару раз, поэтому вы должны проверить, уже ли вы разместили свое представление (например, couterLabel.superview != nil)

вот как это должно выглядеть:

final class CounterHeaderView: UITableViewHeaderFooterView {

    static let reuseIdentifier: String = String(describing: self)

    let counterLabel = UILabel()

    override func layoutSubviews() {
        super.layoutSubviews()

        if counterLabel.superview == nil {
            layout()
        }
    }

    func layout() {
        contentView.addSubview(counterLabel)
        counterLabel.translatesAutoresizingMaskIntoConstraints = false
        counterLabel.backgroundColor = .red
        if let textLabel = self.textLabel {
            counterLabel.leadingAnchor.constraint(equalTo: textLabel.trailingAnchor, constant: 6.0).isActive = true
            counterLabel.topAnchor.constraint(equalTo: textLabel.topAnchor).isActive = true
            counterLabel.heightAnchor.constraint(equalToConstant: 24.0).isActive = true
        }
    }
}
...