IOS 學習筆記(1) 檢視UIViewController

haibo wang發表於2014-04-10

1.UIViewController *newController=[[UIViewController alloc] initWithNibName:@"XXX" bundle:nil];中XXX為名字xib的檔名,這個主要用在xib檢視新增到其他檢視中的時候用到,比如自定義UIView,當新增這個自定義View時,新增起xib檔名的要。

 

2.UIViewController建立時,函式的呼叫順序如下:

[viewDidLoad]
[viewWillAppear:]
[viewWillLayoutSubviews]   (iOS之後新API)
[viewDidLayoutSubviews]    (IOS之後新API)
[viewDidAppear:]

當UIViewController銷燬時,函式的呼叫順序為:
[viewWillDisappear:]
[viewDidDisappear:]
[viewDidUnload]  (IOS6之後不再被系統呼叫)

不過,就像人只出生和死亡一次卻能夠在整個人生的道路上起起伏伏,UIViewController的viewDidLoad和viewDidUnload只會被系統呼叫一次,但是其他幾個方法會隨著主View的狀況,反覆被呼叫。

3UIViewController對於旋轉的支援

UIViewController在支援旋轉時也擁有一套訊息處理函式

算上viewWillLayoutSubviews和viewDidLayoutSubviews兩個函式,這些回撥函式會被系統根據固定的順序觸發呼叫。這個順序會根據具體的作業系統的不同而不同

     在IOS5中,此順序如下:

[shouldAutorotateToInterfaceOrientation:]
[willRotateToInterfaceOrientation:duration:]
[viewWillLayoutSubviews]
[viewDidLayoutSubviews]
[willAnimateRotationToInterfaceOrientation:duration:]
[didRotateFromInterfaceOrientation:]

    在IOS6中,此順序如下:

[shouldAutorotate]
[supportedInterfaceOrientations]
[willRotateToInterfaceOrientation:duration:]
[viewWillLayoutSubviews]
[viewDidLayoutSubviews]
[willAnimateRotationToInterfaceOrientation:duration:]
[didRotateFromInterfaceOrientation:]

當開始呼叫willRotateToInterfaceOrientation:duration時,當前所有佈局都還沒有變

當開始呼叫willAnimateRotationToInterfaceOrientation:duration:時,所有介面的佈局已經根據autoresize機制或者autolayout機制變更完畢,開發者只是在此函式中可以提供更多的佈局配置

當開始呼叫didRotateFromInterfaceOrientation時,所有關於旋轉的佈局已經全部完成。

3.多層UIViewController

就像UIView可以addSubview和removeFormSuperview般,IOS5之後,UIViewController也能夠進行多層次的疊加

UIViewController的多層程式設計API和UIView相似

-(void)addChildViewController:(UIViewController *)childController
-(void)removeFromParentViewController

 

UIViewController的多層開發比UIView的多層開發更為便捷,之所以這麼說,是因為控制器所能做的事情往往不僅在於動作,更在於系統對於控制器回撥函式的支援力度。

就像UIViewController,如果我們在他的子系統中重寫方法

-(void)willMoveToParentViewController:(UIViewController *)parent
-(void)didMoveToParentViewController:(UIViewController *)parent

那麼控制器就能完全掌握多層次疊加和撤銷的過程,作為childViewController的UIViewController物件,會在父UIViewController將自己加到多層結構時呼叫willMoveToParentViewController,會在父UIViewController將自己撤銷多層結構時呼叫didMoveToParentViewController

相關文章