4

我正在通过子类化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"),则代理在访问此变量时会崩溃(如上所述)。

有任何想法吗?

4

3 回答 3

4

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

let bundle = Bundle(for: self.classForCoder)
image = UIImage(named: "your_image.png", in: bundle, compatibleWith: self.traitCollection)!
self.setImage(image, for: .normal) 
于 2017-07-04T00:04:30.333 回答
3

我使用 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 没有使用图像文字。以防万一有人需要。

于 2018-04-10T17:49:41.600 回答
2

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

这是更新的代码:

import UIKit

@IBDesignable
class MyView: UIView {

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

}
于 2017-04-18T06:09:13.047 回答