访问@IBInspectable UIImage时,接口构建器代理崩溃

时间:2016-01-21 09:27:20

标签: ios uiview interface-builder ibinspectable

我通过继承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 个答案:

答案 0 :(得分:2)

问题是Interface Builder中的图像路径与应用程序中的路径不同,因此IB会取消引用nil图像。您可以通过使用选项,然后在IB中的“属性”检查器中设置图像来解决此问题。

这是更新后的代码:

import UIKit

@IBDesignable
class MyView: UIView {

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

}

答案 1 :(得分:2)

您不必在IB中的检查器中设置图像,这完全是代码中的解决方案。

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

答案 2 :(得分:1)

我使用ibinspectable UIImage有类似的错误。我使用image literal作为初始值并导致错误。我通过删除该图像文字来解决它并更改为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没有使用图像文字。以防有人需要它。