我还在学习视图是如何工作的,但我发现了一个我无法解决的问题......
我得到了类GraficsBalancGlobalViewController
,它是类GraficViewController
class GraficsBalancGlobalViewController: GraficViewController {
@IBAction func afegeixGrafic(sender: NSButton) {
addNewGrafic() // which is set on the GraficViewController
}
}
当我执行IBAction afegeixGrafic
时,我的程序在下面标记的行上崩溃:
class GraficViewController: NSViewController, GraficViewDataSource {
@IBAction func button(sender: NSButton) {
addNewGrafic()
}
func addNewGrafic() {
let frame = NSRect(x: 0, y: 0, width: self.view.bounds.width , height: self.view.bounds.width * 0.25)
let nouGrafic = GraficView(frame: frame)
scrollView.addSubview(nouGrafic) <---- BREAK here!
}
@IBOutlet weak var scrollView: NSView!
//...more code
}
编译器说:
致命错误:在解包可选值时意外发现nil
但GraficViewController
内的按钮(IBAction)效果很好!!所以我想这个问题与scrollView有关,但我不知道它可以是什么......它被初始化了..
GraficView(frame: frame)
不是问题,因为我尝试并运作良好。答案 0 :(得分:0)
我相信!
是你的困境的罪魁祸首:
@IBOutlet weak var scrollView: NSView!
Xcode确实为!
s强制解包(IBOutlet
)生成此条目,但它应该是可选的(?
)因为你没有保证 < / em>该引用将被设置。如果你有一些依赖于scrollView
存在的逻辑,你可以依靠didSet
来实现:
@IBOutlet weak var scrollView: NSView? {
didSet {
guard let sview = scrollView else {
return // because scrollView is nil for some reason
}
// do your scrollView existence dependent logic here (eg. reload content)
}
}
func addNewGrafic() {
let frame = NSRect(x: 0, y: 0, width: self.view.bounds.width , height: self.view.bounds.width * 0.25)
let nouGrafic = GraficView(frame: frame)
scrollView?.addSubview(nouGrafic)
}
我希望这会有所帮助。