Как я могу использовать IBInspectable для управления свойством подпредставления? - PullRequest
0 голосов
/ 10 ноября 2018

Я пишу пользовательское представление с двумя метками в качестве подпредставлений - titleLabel и subtitleLabel.

Я добавил два @IBInspectable свойства с именами titleText и subtitleText, чтобы я мог очень легко устанавливать тексты меток в раскадровке.

class MyView : UIView {
    var titleLabel: UILabel!
    var subtitleLabel: UILabel!

    @IBInspectable
    var titleText: String? {
        get { return titleLabel.text }
        set {
            titleLabel.text = newValue
            let fontSize = // calculates appropriate font size for the text...
            titleLabel.font = font.withSize(fontSize)
        }
    }

    @IBInspectable
    var subtitleText: String? {
        get { return subtitleLabel.text }
        set {
            subtitleLabel.text = newValue
            let fontSize = // calculates appropriate font size for the text...
            subtitleLabel.font = font.withSize(fontSize)
        }
    }

    override func draw(_ rect: CGRect) {
        // here I make the view look prettier, irrelevant to the question
    }
}

Теперь мне нужно инициализировать эти две метки и добавить их как подпредставления MyView. Я думал, что смогу сделать это в awakeFromNib:

override func awakeFromNib() {
    titleLabel = UILabel(frame: CGRect(
        x: ...,
        y: ...,
        width: ...,
        height: ...))
    self.addSubview(titleLabel)
    subtitleLabel = UILabel(frame: CGRect(
        x: ...,
        y: ...,
        width: ...,
        height: ...))
    self.addSubview(subtitleLabel)

}

Итак, я добавил MyView в раскадровку и установил его свойства с помощью инспектора свойств, и я запустил приложение. Это разбилось.

Очевидно, свойства IBInspectable установлены до awakeFromNib, поэтому к тому времени метки не были инициализированы.

Это означает, что мне нужно инициализировать метки в методе, который вызывается до установки свойств IBInspectable.

Что это за метод, который вызывается до установки IBInspectable свойств, которые я могу переопределить для инициализации подпредставлений?

1 Ответ

0 голосов
/ 10 ноября 2018

Это может быть очевидно, но правильный способ поместить такие вещи в это инициализатор .

// called when initialized from code
override init(frame: CGRect) {
    super.init(frame: frame)
    commonInit()
}

// called when initialized from storyboard/xib
required init?(coder: NSCoder) {
    super.init(coder: coder)
    commonInit()
}

private func commonInit() {
   // add subviews
}

Кроме того, в вашем конкретном случае нет реальной причины для опций:

let titleLabel: UILabel = UILabel()

Вы можете добавить метки как подпредставления и обновить кадры позже.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...