当我创建一个新的NSVC子类并向它添加一些IBOulets时,当我尝试访问它们时,它们总是为零。我尝试过创建一个新项目和一个只有一个接口的VC类,但它仍然是零的。
我已经查过他们确实有联系。我尝试用完整的nib名称实例化这个类。我还清理了项目,并销毁了导出的数据。没有一个能起作用的。
那么是什么导致了这一切呢?所有的新项目都在进行;我在我的旧项目中增加了新的渠道,它们运行得很好。所有的IBOutlets都是零,而不仅仅是被选中的少数。我正在使用Xcode 7.1.1。
我得到的错误是:
致命错误:在展开可选值时意外找到零
发布于 2016-01-29 17:39:40
如果其他人也面临类似的问题,我在周围找到了一份工作。IBOutlet是零,因为它的超级视图从来没有加载,所以,应用程序从来没有创建它。一个简单的黑客是在使用任何子视图之前编写这个:
let view = viewController.view这就创建了视图,因此所有的出口都在上面。
P.S.我知道这不是一个真正的解决方案,但我想不出另一个解决方案。如果有人有任何建议,请随意张贴。
发布于 2016-01-29 18:46:57
我的猜测是,在视图加载之前,您正在尝试访问init方法中的出口,或者在设置值时从访问器访问。处理这种情况有两种方法。
第一种方法是将子视图的更新推迟到您知道视图已经加载之后。我是通过从updateView()调用viewWillAppear()方法来做到这一点的。通常,当变量被更改时,我也会调用这个方法,所以我会在继续之前进行测试,以确保视图已经加载。如果视图还不存在,则设置视图没有任何价值。看起来是这样的:
class MyViewController: UIViewController {
var product: Product {
didSet {
updateView()
}
}
@IBOutlet private weak var productNameLabel: UILabel!
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
updateView()
}
private func updateView() {
guard isViewLoaded() else {
return
}
if let product = product {
productNameLabel.text = product.title
}
}
}另一个选项,与您所做的类似,是强制视图尽早加载。我认为这不太可取,但在某些情况下,这是正确的方法。但是,不要像你发现的那样去做,而是更有意识地这样做:
class MyViewController: UIViewController {
var product: Product {
didSet {
loadViewIfNeeded()
productNameLabel.text = product.title
}
}
@IBOutlet private weak var productNameLabel: UILabel!
}https://stackoverflow.com/questions/33933701
复制相似问题