在 iOS 中,将视图添加为子视图与将视图分配给视图 属性 之间有区别吗?

In iOS, is there a difference between adding a view as a subview versus assigning a view to the view property?

我试图弄清楚 iOS 编程中的任何歧义,所以我看过一些教程,其中开发人员将他们的主视图分配给 viewController 的视图 属性,例如所以:

let sceneView = ARSCNView(frame: self.view.frame)
view = sceneView

但是我也看到开发人员将他们的主视图作为子视图添加到视图 属性 中,如下所示:

let sceneView = ARSCNView(frame: self.view.frame)
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.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() 中设置视图,而不是像 rmaddy 所建议的那样在 viewDidLoad() 中进行替换,则类似的方法可行。诀窍是获得正确的框架——例如,如果您在导航控制器中,框架将不同。

override func loadView() {
    let sceneView = UIView(frame: UIScreen.main.bounds)
    sceneView.backgroundColor = UIColor.red
    self.view = sceneView
}