IBDesignable никогда не завершает обновление UITableViewCell в раскадровке


Этот вопрос аналогичен этому, но не совсем то же самое.

Я создал подкласс UITableViewCell, который ссылается на пользовательское перо и помечает его как @IBDesignable. Изменения, которые вносятся как в код, так и из него .xib-файл корректно отображается в симуляторе и на устройстве,но не в раскадровке.

import UIKit

@IBDesignable class TextFieldTableViewCell: UITableViewCell {

    var view: UIView!

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)

        setup()
    }

    override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
        super.init(style: style, reuseIdentifier: reuseIdentifier)

        setup()
    }

    func setup() {
        view = loadViewFromNib()
        view.frame = bounds
        view.autoresizingMask = [UIViewAutoresizing.FlexibleWidth, UIViewAutoresizing.FlexibleHeight]
        contentView.addSubview(view)
    }

    func loadViewFromNib() -> UIView {

        let bundle = NSBundle(forClass: self.dynamicType)
        let nib = UINib(nibName: "TextFieldTableView", bundle: bundle)
        let view = nib.instantiateWithOwner(self, options: nil)[0] as! UIView

        return view
    }
}

Раскадровка отображает постоянное "обновление конструктивных элементов".

Обновление Конструктивных Элементов

Разбиение задачи на менее сложные проверка только подклассов UITableViewCell и маркировка его как @IBDesignable приводит к тому же постоянному "обновлению Designables".

import UIKit

@IBDesignable class TextFieldTableViewCell: UITableViewCell {

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

    override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
        super.init(style: style, reuseIdentifier: reuseIdentifier)
    }

}

Кому-нибудь удалось создать подкласс @IBDesignable UITableViewCell? Это происходит в Xcode 7 beta 6 и beta 5.

3 10

3 ответа:

Эта проблема была решена с Xcode 9.

Я сообщил об этой проблеме в Apple и, по крайней мере, знаю, что это известная ошибка. В настоящее время это открытый вопрос под номером проблемы 17973876.

Edit: начиная с 27.12.2016 эта ошибка по-прежнему помечена как открытая.

У меня были похожие проблемы. Этот поток помог мне понять проблему: Есть ли способ для Interface Builder визуализировать IBDesignable представления, которые не переопределяют drawRect:

Я заставил его работать, добавив

override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
        super.init(style: style, reuseIdentifier: reuseIdentifier)
        layoutSubviews()
    }

Насколько я понял после прочтения приведенной выше ссылки на стек, IBDesignable загружает перо в раскадровку не из пера или из кодера, а изinit with frame . Не слишком уверен, но я думаю, что init со стилем делает то же самое.

Похоже, что ошибка "обновления" происходит только тогда, когда ячейка находится внутри раскадровки. Все работает нормально, когда вы создаете специальные .файл xib только для ячейки.

Надеюсь, они скоро это исправят.