Существует NSKeyValueCoding
протокол. , которому соответствуют многие объекты в пределах UIKit
.
Одним из методов в NSKeyValueCoding
является valueForKey:
(и многие другие соответствующие методы, проверьте документацию, на которую я ссылаюсь).
Вызывая valueForKey:
для объекта, мы можем во время выполнения получить доступ к свойствам, которые были установлены в построителе интерфейса.
Итак, например, на этой этикетке я мог бы сделать что-то вроде этого:
Цель-C:
NSString *style = [myLabel valueForKey:@"styleName"];
Свифт:
let style = myLabel.valueForKey("styleName")
Теперь я могу получить значение, установленное через Interface Builder, и во время выполнения я могу что-то сделать с меткой в зависимости от того, какое значение было установлено здесь. Например, здесь я мог бы использовать конкретное «имя стиля» для оформления этикетки определенным образом.
Если вы будете искать в проекте valueForKey
или "styleName"
, вы, скорее всего, найдете, где используется это свойство и что именно с ним делается.
Чтобы ответить на мой вопрос об инспекторе атрибутов, начиная с Xcode 6, мы можем использовать свойство @IBInspectable
для создания свойств, которые будут отображаться в инспекторе атрибутов (как показано здесь). Рассмотрим это расширение UIView
:
extension UIView {
@IBInspectable var borderColor : UIColor? {
set (newValue) {
self.layer.borderColor = (newValue ?? UIColor.clearColor()).CGColor
}
get {
return UIColor(CGColor: self.layer.borderColor)
}
}
}
Теперь, если мы посмотрим на инспектор атрибутов для любого UIView
(или подкласса) в нашей раскадровке, мы увидим это:
Теперь у нас есть свойство «Цвет границы», доступное через инспектор атрибутов, которого обычно там нет. Причина, по которой я указываю на этот инструмент, заключается в том, что всякий раз, когда вы устанавливаете одно из этих свойств с помощью инспектора атрибутов, установленное вами значение фактически сохраняется как один из этих «пользовательских атрибутов времени выполнения»:
И всякий раз, когда это представление загружается из XIB в моем приложении, одной из первых вещей, которая происходит, является то, что моему свойству borderColor
будет присвоен красный цвет, который я выбрал в Interface Builder.
person
nhgrif
schedule
06.05.2015