Использование IBDesignable и prepareForInterfaceBuilder с UILabel

у меня есть подкласс UIView под названием MyView что я создаю.

в нем есть UILabel (это добавлено в коде не в InterfaceBuilder по причинам).

у меня тогда есть свойство на MyView под названием color.

то, что я хотел бы, чтобы Interface Builder мог выбрать color а также для отображения метки с шрифтом, установленным на этот цвет.

в моем коде I иметь...

@IBDesignable class MyView: UIView {

    private let textLabel = UILabel()

    @IBInspectable var color: UIColor = .blackColor() {
        didSet {
            textLabel.textColor = color
        }
    }

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

        initialSetup()
    }

    override init(frame: CGRect) {
        super.init(frame: frame)

       initialSetup()
    }

    private func initialSetup() -> Void {
        self.backgroundColor = .clearColor()

        textLabel.textAlignment = .Center
        textLabel.numberOfLines = 0

        addSubview(textLabel)
    }

    override func layoutSubviews() {
        super.layoutSubviews()

        textLabel.frame = bounds
    }

    // I have no idea what I'm doing here?!
    override func prepareForInterfaceBuilder() {
        // should I create a label specifically for here?
        // or should I use the property textLabel?

        textLabel.text = "Hello, world!" // setting place holder IB text?
        textLabel.textColor = color
        textLabel.font = .systemFontOfSize(21)
        textLabel.textAlignment = .Center
        textLabel.numberOfLines = 0

        // do I need to add sub view?
    }

}

IBInspectable

в IB я вижу свойство цвета там, и я могу его установить. Досадно, что он принимает значение по умолчанию .clearColor () хотя и не тот цвет, который я установил в коде. Есть ли способ это исправить?

IBDesignable

когда я помещаю представление в InterfaceBuilder, он показывает все проверяемые свойства, но ничего не отображается в фактическом представлении.

когда я запускаю его все работает нормально. Я просто хотел бы, чтобы что-то работало (кроме drawRect) в IB. Однако я нахожу явное отсутствие документации.

Edit-Предупреждения

Я только что заметил, что я получаю ошибки сборки / предупреждения...

предупреждение: IB Designables: игнорирование определяемого пользователем атрибута времени выполнения для ключевого пути " цвет "на экземпляре"UIView". Нажмите исключение при попытке установить его значение: [ setValue:forUndefinedKey:]: этот класс не соответствует кодированию ключевого значения для ключевого цвета.

это, вероятно, изменит решение:)

3 ответов


Я скопировал код из вашего вопроса в новое приложение, добавил представление и установил свойство, и он работал просто отлично.

ошибка, которую вы видите, предполагает, что в какой-то момент вы изменили представление на простой UIView в инспекторе удостоверений (определенные пользователем атрибуты остаются в этом случае).

enter image description here


, когда цвета установлено, что вам нужно обновить свойство textLabel, как показано ниже, используя didSet

@IBInspectable var color: UIColor = UIColor.blackColor() {
    didSet {
        textLabel.textColor = color
    }
}

Я использую swift 2.0 и в моем случае отсутствовал динамический собственность. Окончательный код:

@IBInspectable dynamic var radius:CGFloat = 2.0 {
    didSet {
     //   setNeedsDisplay()
        layer.cornerRadius = radius

    }
}

узнайте об ошибке во время сборки для IB Designables: http://lamb-mei.com/537/xcode-ibdesignables-ignoring-user-defined-runtime-attribute-for-key-path-bordercolor-on-instance-of-uiview-this-class-is-not-key-value-coding-compliant-for-the-key-bordercolor/