UIViewController 生命周期
前言
UIViewController 往往是 iOS 頁面開發的基礎,用戶交互和數據展示都是由它來控制,了解了它的生命周期,就能做到:在合適的時機,做合適的事情。
順序
下面對 UIViewController 的每個生命周期函數進行一個打印,確定它們的執行順序。
@implementation ViewController- (void)loadView {[super loadView];NSLog(@"%@", NSStringFromSelector(_cmd)); }- (void)viewDidLoad {[super viewDidLoad];NSLog(@"%@", NSStringFromSelector(_cmd)); }- (void)viewWillAppear:(BOOL)animated {[super viewWillAppear:animated];NSLog(@"%@", NSStringFromSelector(_cmd)); }- (void)viewWillLayoutSubviews {[super viewWillLayoutSubviews];NSLog(@"%@", NSStringFromSelector(_cmd)); }- (void)viewDidLayoutSubviews {[super viewDidLayoutSubviews];NSLog(@"%@", NSStringFromSelector(_cmd)); }- (void)viewDidAppear:(BOOL)animated {[super viewDidAppear:animated];NSLog(@"%@", NSStringFromSelector(_cmd)); }@end 復制代碼含義
- loadView
此時,控制器的 view 還未初始化,可以通過重寫這個方法自定義控制器的 View,如果這樣做,那就不能調用[super loadView](上面代碼調用是為了方便打印,不然屏幕就是黑的)。
- viewDidLoad
在控制器的生命周期中,它只會被調用一次,此時,view 已經初始化好,非常適合做一些頁面的初始化任務。由于此時 view 的 bounds 尚未確定,所以不適合寫 frame 類型的布局代碼,但是給視圖添加約束沒有影響。
- viewWillAppear
它會在控制器的視圖將要出現在屏幕中時被調用,在控制器生命周期中可能會被調用多次。在此處,適合做一些與視圖出現相關聯的任務,例如改變狀態欄的方向、風格。
- viewWillLayoutSubviews
當 view 的子視圖即將布局時,此方法會被調用,觸發的條件是:
- view 被添加到視圖層次中
- view 的 bounds 發生了改變
- 調用了 - setNeedsLayout方法
- 調用了 - layoutIfNeeded方法
這個方法是寫 frame 布局代碼的好地方,將 view 的子視圖布局好,每次 view 大小發生改變時,其子視圖布局也會相應改變。
- viewDidLayoutSubviews
當 view 的子視圖已經布局時,此方法會被調用,觸發條件同上。
- viewDidAppear
它會在控制器的視圖出現在屏幕后被調用,此時,view 的 bounds 已經確定,不過在這里寫布局相關代碼,可能會反映到屏幕上。
- viewWillDisappear
視圖即將從屏幕中消失時觸發。
- viewDidDisppear
視圖從屏幕中消失后觸發。
問題
1、上面測試代碼中,- viewWillLayoutSubviews 方法打印了兩次?
答:因為 view 被添加到視圖層次中會觸發一次,view 的 bounds 改變還會觸發一次。
2、有控制器 A、B,從 A push 到 B,是 A 的 - viewDidDisappear 先觸發,還是 B 的 - viewWillAppear 先觸發?
答:B。
總結
以上是生活随笔為你收集整理的UIViewController 生命周期的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: DIV+CSS网页布局常用的一些基础知识
- 下一篇: 为什么说“概率”带来一场现代革命?