Использование 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 в инспекторе удостоверений (определенные пользователем атрибуты остаются в этом случае).
, когда цвета установлено, что вам нужно обновить свойство 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/