我已经在viewDidLoad
, init
,viewWillAppear
和中看到了它loadView
。我听到了各种各样的答案,并认为最好的答案是明确的!
4 回答
大多数视图初始化应该在viewDidLoad
. viewWillAppear
不合适,因为它可以在视图控制器的生命周期中多次调用。
布局应该在 中完成,viewWillLayoutSubviews
但子视图的实际创建属于viewDidLoad
.
loadView
仅当您希望视图控制器的根视图不是简单的空UIView
.
指定的初始化器。如果你继承 UIViewController,你必须调用这个方法的超级实现,即使你没有使用 NIB。(为方便起见,默认的 init 方法会为您执行此操作,并为这两个方法的参数指定 nil。)在指定的 NIB 中,文件所有者代理应将其类设置为您的视图控制器子类,并带有视图出口连接到主视图。如果您使用 nil nib 名称调用此方法,则此类的 -loadView 方法将尝试加载名称与视图控制器的类相同的 NIB。如果实际上不存在这样的 NIB,那么您必须在调用 -view 之前调用 -setView:,或者覆盖 -loadView 方法以编程方式设置视图。
上面的文字来自 Apple 文档。根据它,您应该在“loadView”方法中执行此操作。
没有性能差异(所有这些都只是普通的方法调用......)。
唯一的实际区别是viewWillAppear:
在视图变得可见时调用它(不仅仅是一次),因此它不是放置初始化代码的好地方。顺便说一句,您还有另外两个选择:(init
或指定的initWithWhatever:
)和viewDidLoad
方法。
您可以在 viewDidLoad 之前创建一个视图并将视图添加到 viewDidLoad 中,在 ViewWillLayout 上布局视图并在 viewWillApper 上加载数据(如果有)。您可以看到下面的示例(导入 UIKit)
class MyView: UIViewController {
// create the view
let myview: UIView = {
let view = UIView()
view.translatesAutoresizingMaskIntoConstraints = false
view.backgroundColor = .orange
return view
}()
override func viewDidLoad() {
super.viewDidLoad()
// Add the view
self.view.addSubview(myview)
}
override func viewWillLayoutSubviews() {
super.viewWillLayoutSubviews()
// create the constraints
NSLayoutConstraint.activate([
self.myview.topAnchor.constraint(equalTo: view.topAnchor),
self.myview.leftAnchor.constraint(equalTo: view.leftAnchor),
self.myview.rightAnchor.constraint(equalTo: view.rightAnchor),
self.myview.bottomAnchor.constraint(equalTo: view.bottomAnchor)
])
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(true)
// You can implement extra data to your view here
}
}