Агент построителя интерфейса падает при доступе к @IBInspectable UIImage

Я реализую пользовательский вид путем создания подклассов UIView и используя @IBInspectable для некоторых из моих переменных. Два из них - UIImage. Если я пытаюсь получить доступ к одному из них в коде, сборщик интерфейса выдает следующее сообщение:

file:///PathToMyProject/MyProject/Pod/Classes/UI/View/MyView.xib: error: IB Designables: Failed to update auto layout status: The agent crashed

а также

file:///PathToMyProject/MyProject/Pod/Classes/UI/View/MyView.xib: error: IB Designables: Failed to render instance of MyView: The agent crashed

Все отлично работает на симуляторе и устройстве. Вот как вы можете воспроизвести это, предполагается image_one.png в активе:

import UIKit

@IBDesignable
class MyView: UIView {

    @IBInspectable
    var anImage: UIImage = UIImage(named: "image_one")!

}

Фактически агент построителя интерфейса падает при инициализации этой переменной. Если ты пишешь var anImage: UIImage! = UIImage(named: "image_one"), тогда агент падает при доступе к этой переменной (как указано выше).

Есть идеи?

3 ответа

Вам не нужно устанавливать свой образ в инспекторе в IB, здесь решение чисто в коде.

let bundle = Bundle(for: self.classForCoder)
image = UIImage(named: "your_image.png", in: bundle, compatibleWith: self.traitCollection)!
self.setImage(image, for: .normal) 

У меня похожая ошибка при использовании ibinspectable UIImage. Я использовал изображение литерала в качестве начального значения, и это вызывает ошибку. Я решил это, удалив этот образ литерала и изменил на UIImage:named:,

Это вызвало ошибку:

@IBInspectable var _iconImage: UIImage? = #imageLiteral(resourceName: "ic_arrow_dropdown") {
    didSet { iconImageView.image = _iconImage }
}

_

Решено с помощью:

@IBInspectable var _iconImage: UIImage? = UIImage(named: "ic_arrow_dropdown") {
    didSet { iconImageView.image = _iconImage }
}

_

* Я знаю, что OP не использовал литерал изображения. На всякий случай кому-то это нужно.

Проблема в том, что пути к изображениям в Интерфейсном Разработчике отличаются от путей в вашем приложении, поэтому IB разыменовывает нулевое изображение. Это можно исправить с помощью опций и затем установить изображение в инспекторе атрибутов в IB.

Вот обновленный код:

import UIKit

@IBDesignable
class MyView: UIView {

    @IBInspectable
    var anImage: UIImage? = UIImage(named: "image_one")

}
Другие вопросы по тегам