1. 程式人生 > >畫面跳轉各方法呼叫的時機-init、viewDidLoad、viewWillAppear、viewDidAppear、viewWillDisappear、viewDidDisappear

畫面跳轉各方法呼叫的時機-init、viewDidLoad、viewWillAppear、viewDidAppear、viewWillDisappear、viewDidDisappear

init:方法

在init方法中例項化必要的物件(遵從LazyLoad思想)

init方法中初始化ViewController本身

loadView:方法

這是當沒有正在使用nib檢視頁面,子類將會建立自己的自定義檢視層。絕不能直接呼叫。

如果手工維護views,必須過載重寫該方法。

當view需要被展示而它卻是nil時,viewController會呼叫該方法。

loadView和IB構建view

你在控制器中實現了loadView方法,那麼你可能會在應用執行的某個時候被記憶體管理控制呼叫。 如果裝置記憶體不足的時候, view 控制器會收到didReceiveMemoryWarning的訊息。 預設的實現是檢查當前控制器的view是否在使用。 如果它的view不在當前正在使用的view hierarchy裡面,且你的控制器實現了loadView方法,那麼這個view將被release, loadView方法將被再次呼叫來建立一個新的view。

viewDidLoad:方法

在檢視載入後被呼叫:

如果是在程式碼中建立的檢視載入器,他將會在loadView方法後被呼叫;

如果是從nib檢視頁面輸出,他將會在檢視設定好後後被呼叫。

過載重寫該方法以進一步定製view

在iPhone OS 3.0及之後的版本中,還應該過載重寫viewDidUnload來釋放對view的任何索引

viewDidLoad後呼叫資料Model

viewWillAppear: 方法
Called when the view is about to made visible. Default does nothing
檢視即將可見時呼叫。預設情況下不執行任何操作


viewDidAppear: 
Called when the view has been fully transitioned onto the screen. Default does nothing
檢視已完全過渡到螢幕上時呼叫


viewWillDisappear:
Called when the view is dismissed, covered or otherwise hidden. Default does nothing
檢視被駁回時呼叫,覆蓋或以其他方式隱藏。預設情況下不執行任何操作


viewDidDisappear:
Called after the view was dismissed, covered or otherwise hidden. Default does nothing
檢視被駁回後呼叫,覆蓋或以其他方式隱藏。預設情況下不執行任何操作

執行順序:

 從程式的log來看:

2012-10-19 15:51:44.811inHyron[483:b903] init

2012-10-19 15:51:54.081inHyron[483:b903] viewDidLoad

2012-10-19 15:51:54.082inHyron[483:b903] viewVillAppear

2012-10-19 15:51:54.084 inHyron[483:b903] viewDidAppear

很明顯,先執行init、然後執行viewDidLoad,然後是viewWillAppear最後是viewDidAppear,這樣檢視就建立好了,當檢視消失或者被覆蓋的時候:

2012-10-19 15:54:14.557inHyron[483:b903] viewWillDisappear

2012-10-19 15:54:14.558inHyron[483:b903] viewDidDisappear

這樣一來檢視就消失了,當模擬記憶體警告的時候:

2012-10-19 15:55:14.333inHyron[483:b903] Received simulated memory warning.

2012-10-19 15:55:14.334inHyron[483:b903] viewWillUnload

2012-10-19 15:55:14.335 inHyron[483:b903]viewDidUnload

從log可以看出,當檢視控制物件收到記憶體警告的時候,程式會執行viewWillUnload最後是執行viewDidUnload。

這樣,一套的流程就完成了.

其實當檢視A切換到檢視B的真正的流程並不是按上面的流程跑下來的,

並不是A檢視:1,viewWillDisappear 2,viewDidDisappear,然後B檢視:3,viewDidLoad 4,viewVillAppear 5,viewDidAppear這樣。

正確的順序流程應該是:

1,B檢視 viewDidLoad

2,A檢視 viewWillDisappear

3,B檢視 viewVillAppear

4,A檢視 viewDidDisappear

5,B檢視 viewDidAppear

如圖所示