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

У меня есть подкласс UIView под названием MyView, который я создаю.

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

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

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

В моем коде у меня есть...

@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. Однако я обнаруживаю явное отсутствие документации.

Изменить — Предупреждения

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

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

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


person Fogmeister    schedule 22.01.2015    source источник


Ответы (3)


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

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

введите здесь описание изображения

person jrturton    schedule 22.01.2015
comment
Что ж, в настоящее время я получаю ошибку сегментации: 11 при попытке запустить, поэтому понятия не имею, что происходит. Это может быть причиной этого. Рад узнать, что я правильно понял код. Сегодня я установил Xcode 4 (причины), поэтому мне интересно, не испортилась ли эта установка компиляторами или что-то в этом роде?! Спасибо хоть. Сохраню свой проект Swift: D - person Fogmeister; 22.01.2015
comment
ОМЛГ! Ошибка сегмента возникла из-за того, что я использовал .clearColor() в атрибуте вместо UIColor.clearColor(), но в коде не было ошибок. Во всяком случае, теперь все работает :D Спасибо! - person Fogmeister; 22.01.2015

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

@IBInspectable var color: UIColor = UIColor.blackColor() {
    didSet {
        textLabel.textColor = color
    }
}
person topher91    schedule 22.01.2015
comment
Я добавил это. Но я только что заметил, что также получаю предупреждения... Игнорирование определяемого пользователем атрибута времени выполнения для цвета keyPath... Добавил это в вопрос. - person Fogmeister; 22.01.2015

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

@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-compliable-for-the-key-bordercolor/

person Ramis    schedule 13.11.2015