我通过继承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")
,则代理会在访问此变量时崩溃(如上所述)。
有什么想法吗?
答案 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没有使用图像文字。以防有人需要它。