Агент построителя интерфейса падает при доступе к @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")
}