標籤:
ViewController是view的controller,viewController的職責主要包括管理內部各個view的載入顯示與卸載,同時負責與其他ViewController的通訊和協調。
在IOS中 有兩類ViewController:
1. 顯示內容,比如UIViewController,UITableViewController等,同時還可以自訂繼承自UIViewController得ViewController。
2. 用於控制和顯示其他ViewController的ViewController。這種ViewController一般都是一個ViewController容器:如UINavigationViewController和UITabBarController等,
它們都有一個屬性:viewControllers。UINavigationController是以Stack的形式來儲存和管理ViewController,UITabBarController是以Array的形式來管理ViewController。
ViewController生命週期
alloc -> initWithNibName ->loadView ->viewDidLoad ->
viewWillAppear ->viewDidAppear -> viewWillDisappear ->
viewDidDisappear ->dealloc。
啟動程式: ViewDidLoad [view即將顯示,此時superview一般為nil,即view還沒有加到任何一個view之中]
ViewWillAppear [view已經顯示,被加到另一個view中]
View Did Appear [view即將消失,此時一半還沒有調用removeFromSuperView]
按下Home鍵,並沒有任何紀錄(此時程式被掛起)
雙擊Home鍵,刪除該程式: ViewWillDisappear [view從superview中移除了]
View Did Disappear
當view被添加到其他view中之前時,會調用viewWillAppear,而之後會調用viewDidAppear
當view從其他view中移除之前時,會調用viewWillDisAppear,而之後會調用viewDidDisappear
所以只有記憶體不夠的時候或是程式被終止的時候,才會調用viewWillDisappear和viewDidDisappear
loadView和viewDidLoad的區別就是,loadView時view還沒有產生,viewDidLoad時,view已經產生了,loadView只會被調用一次,而viewDidLoad可能會被調用多次(view可能會被多次載入)。
程式碼群組織 -- 》如何設計良好的viewcontroller
1. init裡不要出現建立view的代碼。在init裡應該只有相關資料的初始化(非常重要),init裡不要掉self.view,否則會導致viewcontroller建立view。(因為view是lazyinit的)。
2. loadView中只初始化view,一般用於建立比較關鍵的view如tableViewController的tabView,UINavigationController的navigationBar。
3. viewDidLoad這時候view已經有了,最適合建立一些附加的view和控制項了。有一點需要注意的是,viewDidLoad會調用多次。
4. viewWillAppear這個一般在view被添加到superview之前,切換動畫之前調用。在這裡可以進行一些顯示器前的處理。比如鍵盤彈出,一些特殊的過程動畫。
5. viewDidAppear一般用於顯示後。
iOS ViewController生命週期