我有一款应用程序在XCode 7.0 GM之前完美运行。在使用XCode 7.0 GM构建它之后,它开始崩溃。它在加载我的一个自定义视图时崩溃,代码如下:
func loadViewWithName(viewName: String, owner: UIView) {
let view = NSBundle.mainBundle().loadNibNamed(viewName, owner: owner, options: nil).first as! UIView
view.frame = owner.bounds
owner.addSubview(view)
}
class AddView2 : UIView {
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
loadView()
}
@IBOutlet weak var pendingToAddNotification: UIView!
private func loadView() {
loadViewWithName("AddView2", owner: self)
// print("asd") // if this is uncommented the app doesn't crash
pendingToAddNotification.backgroundColor = UIColor.blackColor() // CRASH HERE, when I try to to change something in the loaded view, most probably because the outlet isn't set (it is nil), which was my assumption since it is called after view is loaded.
}
}
class AddView : UIView {
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
loadView()
}
@IBOutlet weak var pendingToAddNotification: AddView2!
private func loadView() {
loadViewWithName("AddView", owner: self)
pendingToAddNotification.backgroundColor = UIColor.blackColor()
}
}
,其中AddView包含AddView2,而ViewController包含AddView。我有AddView.xib和AddView2.xib文件,其中文件的所有者分别设置为AddView和AddView2。
我认为我做错了,但是为什么相同的代码在DEBUG模式下工作并且更有趣的是为什么如果我取消注释上面提到的print
应用程序没有崩溃并按预期启动,这是非常奇怪的。
XCode 7.0(.1)是否有任何变化,导致此类问题?
它看起来像某种竞争条件,由print
(因为它需要额外的时间来执行)或者通过调试模式(因为它较慢)来修复,但据我所知,这两种视图都是加载必须在主线程中完成,还是我错了?
任何帮助都非常感谢!
EDIT1:这是整个project
EDIT2:刚发现如果我将loadViewWithName
内容复制到loadView
,它就不会崩溃。
答案 0 :(得分:0)
我找到了问题的解决方案 - 制作了全局函数UIView扩展。我仍然不确定问题是什么以及为什么代码不适用于全局函数。