我试图理解iOS编程中的任何歧义,所以我看过开发人员将其主视图分配给viewController的view属性的教程,如下所示:
let sceneView = ARSCNView(frame: self.view.frame)
view = sceneView
但是我也看到开发人员将他们的主视图作为子视图添加到view属性中,如下所示:
let sceneView = ARSCNView(frame: self.view.frame)
view.addSubView(sceneView)
这两个过程是相同还是不同?
答案 0 :(得分:6)
它们不完全相同,但在功能上它们是相似的。以下是差异的演示:
override func viewDidLoad() {
super.viewDidLoad()
self.view.backgroundColor = UIColor.blue
let sceneView = UIView(frame: self.view.frame)
sceneView.backgroundColor = UIColor.red
self.view.addSubview(sceneView)
}
在调试器中:
与替换相比:
override func viewDidLoad() {
super.viewDidLoad()
self.view.backgroundColor = UIColor.blue
let sceneView = UIView(frame: self.view.frame)
sceneView.backgroundColor = UIColor.red
self.view = sceneView
}
在调试器中:
所以你看到虽然它被子视图隐藏了,但当sceneView作为子视图添加时,原始的蓝色视图仍然在视图层次结构中。当您替换视图时,原始蓝色视图根本不再是视图层次结构的一部分。
注意:如果你想在loadView()中设置视图而不是在viewDidLoad()中替换,因为rmaddy建议像这样的东西可以工作。诀窍是获得正确的框架 - 如果你在导航控制器中,例如框架将是不同的。
override func loadView() {
let sceneView = UIView(frame: UIScreen.main.bounds)
sceneView.backgroundColor = UIColor.red
self.view = sceneView
}