线程1:EXC_BAD_ACCESS(代码=2,地址=0x16d8d7ff8)

问题描述 投票:0回答:2

我使用 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)
}
swift xib
2个回答
1
投票

仅通过查看这段代码很难知道更具体的诊断,但我在使用

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



0
投票

如果你在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 } }

	
© www.soinside.com 2019 - 2024. All rights reserved.