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)
}

Life Cycle

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)

Life Cycle

打印

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

Life Cycle

@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 的使用方法 💥

Swift 判斷螢幕方向 📱

Swift Core Data 實現 💾🔥

Swift UISegmentedControl 💻分段控制器!

Swift 實現抽屜效果 🧹

Categorized in: