我使用 UIView 自己的类创建了一个 PieChart,在该类中 loadNib() 方法会抛出此错误。
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
let view: UIView = Bundle.main.loadNibNamed("PieChartView", owner: self, options: nil)!.first as! UIView // Thread 1: EXC_BAD_ACCESS
addSubview(view)
}
仅通过查看这段代码很难知道更具体的诊断,但我在使用
XIBs
时遇到了类似的情况。当我尝试在笔尖的 Custom Class
中定义 Identity Inspector
(而不是 View
)时,出现了问题。确保只有您的 File's Owner
在您的 xib 中的
File's Owner
中定义了自定义类。下面有两个屏幕截图描述了如何配置 xib:文件所有者配置IS 在此设置<- Make sure your custom class
视图的配置不是在此处设置<- Make sure custom class 我仍然不确定为什么,但不知何故,当为视图而不是文件所有者定义自定义类时,视图在
Identity Inspector
方法内多次递归调用自己的
init
方法。我的Bundle.main.loadNibNamed()
文件仅包含4个插座连接,其中之一是超级视图(contentView)。
MusicRowView.xib
设置为我的 File's Owner
,这就是 swift 文件的样子:MusicRowView.swift
如果你在init方法中从nib加载视图,那么当你创建这个视图时,init方法会重复调用自身。虽然我不完全理解这个问题,但我通过在更高的类中加载视图解决了这个问题。
我也没有更改 XIB 文件中的文件所有者(它将为空)。我只为我的自定义视图选择了类。
class MusicRowView: UIView {
@IBOutlet var contentView: UIView!
@IBOutlet weak var coverImageView: UIImageView!
@IBOutlet weak var titleLabel: UILabel!
@IBOutlet weak var subtitleLabel: UILabel!
override init(frame: CGRect) {
super.init(frame: frame)
self.commonInit()
}
required init?(coder: NSCoder) {
super.init(coder: coder)
self.commonInit()
}
private func commonInit() {
Bundle.main.loadNibNamed("MusicRowView", owner: self, options: nil)
self.addSubview(self.contentView)
self.contentView.frame = self.bounds
}
}