Swift UIView Life Cycle 生命週期
什麼是生命週期? swift生命週期(Life Cycle)就是當一個ViewController即將出現時,所會經歷的先後順序,有點像吃飯先吃前菜>主餐>甜點,在swift上就是你的生命週期。
- viewDidLoad:
當 view 被載入到記憶體後,但畫面未被顯示之前,就會執行viewDidLoad。我們通常會重寫 (overrider) 這方法來增加對 view 的初始化。 - viewWillAppear:
這方法是當在 view 將呈現在畫面,且還沒有任何的動畫開始出現在畫面上時被呼叫的。我們可以重寫這個方法來執行與 view 關聯的自定義任務。例如,您可以使用此方法更改 status bar 的方向或樣式,以改變 status bar 即將在 view 呈現的樣子。 - viewDidAppear:
在 viewWillAppear 結束後,即 view 被載入後到 view controller 後,就會載入這個方法。同樣地,我們可以透過重寫來增加任務到已經呈現的 view。 - viewWillDisappear:
這個方法是當 view 將被移除,且動畫開始執行前呼叫的。我們可以重寫這個方法來改變 view 的各種狀態。如我們可以將被改變的 status bar 還原回來。
參考:
Swift UIViewController 生命週期
present (卡片模式) 生命週期
ViewController
跳轉 TestViewController 實測生命週期順序
@IBAction func jumpButtonPress(_ sender: Any) {
let vc = TestViewController()
self.present(vc, animated: true, completion: nil)
}
override func viewWillAppear(_ animated: Bool) {
print("A viewWillAppear")
}
override func viewDidAppear(_ animated: Bool) {
print("A viewDidAppear")
}
override func viewDidLoad() {
super.viewDidLoad()
print("A viewDidLoad")
}
override func viewWillDisappear(_ animated: Bool) {
print("A viewWillDisappear")
}
override func viewDidDisappear(_ animated: Bool) {
print("A viewDidDisappear")
}
override func viewWillLayoutSubviews() {
print("A viewWillLayoutSubviews")
}
override func viewDidLayoutSubviews() {
print("A viewDidLayoutSubviews")
}
TestComtroller
override func viewWillAppear(_ animated: Bool) {
print("B viewWillAppear")
}
override func viewDidAppear(_ animated: Bool) {
print("B viewDidAppear")
}
override func viewDidLoad() {
super.viewDidLoad()
print("B viewDidLoad")
}
override func viewWillDisappear(_ animated: Bool) {
print("B viewWillDisappear")
}
override func viewDidDisappear(_ animated: Bool) {
print("B viewDidDisappear")
}
override func viewWillLayoutSubviews() {
print("B viewWillLayoutSubviews")
}
override func viewDidLayoutSubviews() {
print("B viewDidLayoutSubviews")
}
打印
A viewDidLoad
A viewWillAppear
A viewWillLayoutSubviews
A viewDidLayoutSubviews
A viewDidAppear
// -> 點擊跳轉
B viewDidLoad
B viewWillAppear
B viewWillLayoutSubviews
B viewDidLayoutSubviews
B viewWillLayoutSubviews
B viewDidLayoutSubviews
B viewDidAppear
因為目前是卡片模式
A Controller
是沒有消失
的
present (全螢幕模式) 生命週期
如果present
設置為全螢幕模式
生命週期就會產生變化
A會在B viewDidLoad
後開始消失
let vc = Test1ViewController()
vc.modalPresentationStyle = .fullScreen
self.present(vc, animated: true, completion: nil)
打印
A viewDidLoad
A viewWillAppear
A viewWillLayoutSubviews
A viewDidLayoutSubviews
A viewDidAppear
// -> 點擊跳轉
B viewDidLoad
A viewWillDisappear
B viewWillAppear
B viewWillLayoutSubviews
B viewDidLayoutSubviews
B viewDidAppear
A viewDidDisappear
UINavigationController Push 生命週期
跳轉頁面更改為
NavigationController Push
@IBAction func jumpButtonPress(_ sender: Any) {
let vc = Test1ViewController()
self.navigationController?.pushViewController(vc, animated: true)
}
打印
A viewDidLoad
A viewWillAppear
A viewWillLayoutSubviews
A viewDidLayoutSubviews
A viewDidAppear
// -> 點擊跳轉
B viewDidLoad
A viewWillDisappear
B viewWillAppear
B viewWillLayoutSubviews
B viewDidLayoutSubviews
A viewDidDisappear
B viewDidAppear
與present差異
- present: 等待 B viewDidAppear 後才 viewDidDisappear
- push: 先 viewDidDisappear 後 B才 viewDidAppear
Swift更多文章
Swift 彈出視窗 AlertController 的使用方法 💥