Этот класс не является ключевым кодом, совместимым с @IBInspectable

Я создал @ IBDesignable в пользовательском представлении, чтобы установить свойство из IB. Но я понимаю, что этот класс не соответствует ключевому значению, совместимому с кодировкой, несмотря на то, что у меня есть этот атрибут в моем классе.

@IBDesignable class ExclusiveSelectorView: UIView {
    @IBInspectable var cellWidth: CGFloat?
}

Не удалось установить (cellWidth) определяемое пользователем свойство проверки (Test.ExclusiveSelectorView): [setValue: forUndefinedKey:]: этот класс не является ключевым значением, совместимым с кодировкой для key cellWidth.

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

И это мой класс введите описание изображения здесь

Ответ 1

Вы не можете определить примитивы как nullable для @IBInspectable s.

При попытке сделать это и установите значение для одного из этих свойств, вы получите следующее предупреждение в IBDesignable time:

@IBDesignable class TestDesignable  IB Designables: Игнорирование пользовательского атрибута времени выполнения для ключевого пути "testInt" на примере "TestDesignable". Удалите исключение при попытке установить его значение: [setValue: forUndefinedKey:]: этот класс не подходит для кодирования ключа для ключа testInt.

И во время выполнения вы получите следующую ошибку:

Не удалось установить (testInt) определяемое пользователем свойство проверки (TestDesignable): [setValue: forUndefinedKey:]: этот класс не является ключевым для кодирования ключа для ключа testInt.

Чтобы исправить это, измените его с необязательного на необязательное и дайте ему нулевое значение по умолчанию.

Invalid:

@IBDesignable class TestDesignable: UIView {
  @IBInspectable var testInt: Int? = nil // crash
  @IBInspectable var testFloat: CGFloat? = nil // crash
  @IBInspectable var testPoint: CGPoint? = nil // crash
  @IBInspectable var testColor: UIColor? = nil
}

Действительно:

@IBDesignable class TestDesignable: UIView {
  @IBInspectable var testInt: Int = 0
  @IBInspectable var testFloat: CGFloat = 0
  @IBInspectable var testPoint: CGPoint = .zero
  @IBInspectable var testColor: UIColor? = nil
}