XCode 9 borderColor не работает в определяемых пользователем атрибутах времени выполнения
Я использую это CALayer
расширение:
var borderUIColor: UIColor {
set {
self.borderColor = newValue.cgColor
}
get {
return UIColor(cgColor: self.borderColor!)
}
}
Я думал, что, возможно, из-за этого расширения мой borderColor
кнопки "Отправить" внизу страницы не меняется на белый (как я хочу):
Но нет, я подключил IBOutlet
и попытался установить цвет прямо так:
submitButton.layer.borderColor = UIColor.white.cgColor
Сделал это в viewDidLoad
, viewWillAppear
а также viewDidAppear
потому что я знаю, что в последнем большом обновлении (iOS 10) рендеринг фреймов был существенно изменен (фрейм 1000x1000), и, возможно, сейчас произошли некоторые подобные изменения. Не повезло, хотя.
Я тестировал в iOS 9, 10 и 11. Это не об ОС, а об окружающей среде. Я использую Xcode 9 Beta 5. Есть идеи, как это решить?
5 ответов
Попробуйте украсить ваше объявление с помощью @objc
вот так:
@objc var borderUIColor: UIColor {
...
}
это должно решить вашу проблему
Очистил проект, удалил производные данные и теперь код работает, либо viewDidLoad
, viewWillAppear
или же viewDidAppear
,
Проблема, по-видимому, связана с пользовательскими атрибутами времени выполнения. Xcode 9 больше не принимает расширение VAR здесь. Или, по крайней мере, бета-версия 5.
РЕДАКТИРОВАТЬ: Действительно, добавляя @objc
решает проблему.
Просто столкнулся с той же проблемой и получил другое решение: я просто сделал свой класс KVC-совместимым.
Образец, пошаговый:
- Пользовательский класс - XTCMenuItem со свойством propIdentifier.
- Для соответствия KVC этот класс получил два метода:
- переопределить значение func (forKey key: String) -> Any?
- переопределить func setValue(_ value: Any?, forKey key: String)
- В Identity Inspector я устанавливаю пользовательский класс на "XTCMenuItem" и добавляю определенный пользователем атрибут времени выполнения "propIdentifier" с типом "String" и строковое значение.
Если вы не хотите создавать IBOutlet и просто использовать атрибуты RunTime, то вы можете использовать IBDesignable и установить префикс @objc, это решит вашу проблему.
@objc @IBInspectable var borderColor: UIColor {
get {
return UIColor(cgColor: self.layer.borderColor!)
}
set {
self.layer.borderColor = newValue.cgColor
}
}
Используйте атрибут @IBInspectable. Пример:
@IBInspectable var borderColor = UIColor.green