“`html

Swift UIView Life Cycle 生命週期

Swift 生命週期 (Life Cycle) 是指當一個 ViewController 即將出現時所經歷的先後順序。這個過程就像用餐的順序一樣,通常是前菜 > 主餐 > 甜點。在 Swift 中,這些階段對於管理 UI 及其行為至關重要。

Swift 生命週期方法解析

  • viewDidLoad:
    當視圖被載入到記憶體後,但畫面未被顯示之前,會執行 viewDidLoad。這是進行視圖初始化的理想位置,通常會在這裡設置 UI 元件的初始狀態。
  • viewWillAppear:
    當視圖將要出現在畫面上且動畫尚未開始時,會呼叫 viewWillAppear。這裡適合執行與視圖顯示前的準備工作,例如更新 UI 或檢查狀態。
  • viewDidAppear:
    viewWillAppear 結束後,此方法被呼叫。可以在這裡開始與用戶的互動,例如啟動動畫或記錄事件。
  • viewWillDisappear:
    在視圖將被移除且動畫開始前呼叫 viewWillDisappear。可以在這裡保存狀態或結束與視圖相關的任務。
  • viewDidDisappear:
    當視圖已經消失後會呼叫此方法。在這裡可以進行清理工作,例如釋放資源。

實作範例

以下是一個簡單的 ViewController 實作示例,展示了生命週期方法的使用:

override func viewDidLoad() {
    super.viewDidLoad()
    print("View has loaded")
}

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    print("View will appear")
}

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    print("View did appear")
}

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    print("View will disappear")
}

override func viewDidDisappear(_ animated: Bool) {
    super.viewDidDisappear(animated)
    print("View did disappear")
}

Life Cycle

Present (卡片模式) 生命週期

使用 present 方法進行視圖轉換的生命週期:

@IBAction func jumpButtonPress(_ sender: Any) {
    let vc = TestViewController()
    self.present(vc, animated: true, completion: nil)
}

Life Cycle

打印輸出

A viewDidLoad
A viewWillAppear
A viewDidAppear
// -> 點擊跳轉
B viewDidLoad
B viewWillAppear
B viewDidAppear
A viewDidDisappear

Present (全螢幕模式) 生命週期

present 設置為全螢幕模式,生命週期的順序會有所不同:

let vc = Test1ViewController()
vc.modalPresentationStyle = .fullScreen
self.present(vc, animated: true, completion: nil)

Life Cycle

打印輸出

A viewDidLoad
A viewWillAppear
A viewDidAppear
// -> 點擊跳轉
B viewDidLoad
A viewWillDisappear
B viewWillAppear
B viewDidAppear
A viewDidDisappear

UINavigationController Push 生命週期

使用 UINavigationController 進行頁面跳轉的生命週期:

@IBAction func jumpButtonPress(_ sender: Any) {
    let vc = Test1ViewController()
    self.navigationController?.pushViewController(vc, animated: true)
}

Life Cycle

打印輸出

A viewDidLoad
A viewWillAppear
A viewDidAppear
// -> 點擊跳轉
B viewDidLoad
A viewWillDisappear
B viewWillAppear
B viewDidAppear
A viewDidDisappear

present vs push 的差異

  • present: 等待 B 的 viewDidAppear 後才會觸發 A 的 viewDidDisappear
  • push: 先觸發 A 的 viewDidDisappear 後才會觸發 B 的 viewDidAppear

常見問題解答

Q1: Swift 生命週期為什麼重要?

Swift 生命週期幫助開發者管理 UI 元件的狀態與行為,確保應用程式的流暢性與穩定性。

Q2: 如何在生命週期中處理資料?

viewDidLoad 中加載資料,並在 viewWillAppear 中更新 UI,這樣確保在視圖顯示前資料已正確配置。

Q3: 是否可以自定義生命週期方法?

不可以,但可以在標準生命週期方法中添加自定義邏輯以滿足您的需求。

“`

Categorized in: