UIView , UIViewController Life Cycle 常見問題
在執行專案的過程中,會一直出現常見的幾個問題。生成UI的過程中,由於未生成完成,卻先layout。造成layout尚未完成,會是crash。這些種種問題,是因為對UIView 與 UIViewController Life Cycle 觀念不夠清楚導致的。今天參考了一些大神的文章,重新整理一下思緒。
UIViewController
ViewDidLoad
- 只會被呼叫一次,load 好了就會一直在記憶體裡面
- 常常在此 function 用 model 更新 UI,因為此時所有 outlets 都已經綁定完成
- 不應在此做任何 layout view 的動作 (更改 frame/bounds),因為此時的view 還沒出現在畫面上
viewWillAppear
- 會被呼叫不只一次,因為只要有返回到該畫面的可能性,該 controller 就會有不只一次「準備要顯示」的機會
- 可以在這邊做一些比較耗資源的操作,因為此時畫面已經確定將會顯示了
- 可以在這邊做一些 layout view 的操作,因為 view 已經出現在畫面上了
viewDidAppear, viewWillDisappear
字面上的意思,週期的一部分
大部分 view 的 layout 會交由 autolayout 來處理,但是也有需要手動改變 view layout 方式的時候,這時候有兩個 function 可以讓我們介入 autotlayout 對 view layout 的操作:
viewWillLayoutSubviews, viewDidLayoutSubviews
UIView
UIView 初始化的方式:
- init(frame:) :純 code layout UI 的初始化方法
- init(coder:) : Storyboard layout UI 的初始化方法
- awakeFromNib:在init(coder:) 呼叫後會呼叫這個 function
viewController產生的方法
- 從 storyboard 中初始化
- 呼叫 awakeFromNib()
- 呼叫 Segue 的準備方法
- 綁定 IBOutlets
- viewDidLoad()
- 顯示於畫面時:viewWillAppear -> viewDidAppear
- 離開畫面時: viewWillDisappear -> viewDidDisappear
- 任何 layout view 時:viewWillLayoutSubviews -> viewDidLayoutSubviews
Reference : https://medium.com/@kuotinyen/ios-%E9%9D%A2%E8%A9%A6%E9%A1%8C-1-38dbc900d746