有没有人知道一个很好的教程,它深入地解释了视图控制器的生命周期。我已经阅读了文档,所以请不要将我与他们联系起来。我只是在寻找每个函数的实际解释,例如viewDidLoad和viewWillAppear,viewWillLayoutSubviews等,以及何时最好将它们与Swift中的示例一起使用。如果没有教程,任何人都愿意在答案中解释它们。
答案 0 :(得分:7)
我使用swift为您显示代码。
import UIKit
class LifeCycleViewController: UIViewController {
// MARK: -property
lazy var testBtn: UIButton! = {
var btn: UIButton = UIButton()
btn.backgroundColor = UIColor.redColor()
return btn
}()
// MARK: -life cycle
override func viewDidLoad() {
super.viewDidLoad()
println("View has loaded")
// set the superView backgroudColor
self.view.backgroundColor = UIColor.blueColor()
// add testBtn to the superView
self.view.addSubview(self.testBtn)
}
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
println("View will appear")
}
override func viewDidAppear(animated: Bool) {
super.viewDidAppear(animated)
println("View has appeared")
}
override func viewWillDisappear(animated: Bool) {
super.viewWillDisappear(animated)
println("View will disappear")
}
override func viewDidDisappear(animated: Bool) {
super.viewDidDisappear(animated)
println("View has desappeared")
}
override func viewWillLayoutSubviews() {
super.viewWillLayoutSubviews()
println("SubViews will layout")
// layout subViews
self.testBtn.frame = CGRectMake(100, 100, 100, 100)
}
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
println("SubViews has layouted")
var testBtn_Width = self.testBtn.frame.width
println("testBtn's width is \(testBtn_Width)")
}
}
结果如下:
View has loaded
View will appear
SubViews will layout
SubViews has layouted
testBtn's width is 100.0
SubViews will layout
SubViews has layouted
testBtn's width is 100.0
View has appeared
您可以清楚地看到ViewController的生命周期。
答案 1 :(得分:5)
此图片上的示例不错。
答案 2 :(得分:2)
这就是我看到的方式。
ViewDidLoad - 在创建类并从xib加载时调用。非常适合初始设置和一次性工作。
ViewWillAppear - 在您的视图出现之前调用,适合隐藏/显示字段或您希望每次在视图可见之前发生的任何操作。因为您可能会在视图之间来回切换,所以每次您的视图即将出现在屏幕上时都会调用此视图。
ViewDidAppear - 在视图显示后调用 - 启动动画或从API加载外部数据的好地方。
ViewWill / DidDisappear - 与WillAppear一样的想法。
ViewDidUnload / ViewDidDispose - 在Objective C中,这是你清理和发布内容的地方,但是这是自动处理的,所以你真的不需要在这里做。