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
Другие вопросы по тегам