1

我已经在viewDidLoad, init,viewWillAppear和中看到了它loadView。我听到了各种各样的答案,并认为最好的答案是明确的!

4

4 回答 4

2

大多数视图初始化应该在viewDidLoad. viewWillAppear不合适,因为它可以在视图控制器的生命周期中多次调用。

布局应该在 中完成,viewWillLayoutSubviews但子视图的实际创建属于viewDidLoad.

loadView仅当您希望视图控制器的根视图不是简单的空UIView.

于 2013-02-25T18:52:50.517 回答
0

指定的初始化器。如果你继承 UIViewController,你必须调用这个方法的超级实现,即使你没有使用 NIB。(为方便起见,默认的 init 方法会为您执行此操作,并为这两个方法的参数指定 nil。)在指定的 NIB 中,文件所有者代理应将其类设置为您的视图控制器子类,并带有视图出口连接到主视图。如果您使用 nil nib 名称调用此方法,则此类的 -loadView 方法将尝试加载名称与视图控制器的类相同的 NIB。如果实际上不存在这样的 NIB,那么您必须在调用 -view 之前调用 -setView:,或者覆盖 -loadView 方法以编程方式设置视图。

上面的文字来自 Apple 文档。根据它,您应该在“loadView”方法中执行此操作。

于 2013-02-25T19:49:47.783 回答
0

没有性能差异(所有这些都只是普通的方法调用......)。

唯一的实际区别是viewWillAppear:在视图变得可见时调用它(不仅仅是一次),因此它不是放置初始化代码的好地方。顺便说一句,您还有另外两个选择:(init或指定的initWithWhatever:)和viewDidLoad方法。

于 2013-02-25T18:52:42.427 回答
0

您可以在 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
}

}

于 2017-03-14T03:24:50.040 回答