1. 程式人生 > >iOS 5.0 後UIViewController新增:willMoveToParentViewController和didMoveToParentViewCon

iOS 5.0 後UIViewController新增:willMoveToParentViewController和didMoveToParentViewCon

在iOS 5.0以前,我們在一個UIViewController中這樣組織相關的UIView

在以前,一個UIViewController的View可能有很多小的子view。這些子view很多時候被蓋在最後,我們在最外層ViewController的viewDidLoad方法中,用addSubview增加了大量的子view。這些子view大多數不會一直處於介面上,只是在某些情況下才會出現,例如登陸失敗的提示view,上傳附件成功的提示view,網路失敗的提示view等。但是雖然這些view很少出現,但是我們卻常常一直把它們放在記憶體中。另外,當收到記憶體警告時,我們只能自己手工把這些view從superview中去掉。

在iOS 5.0及以後,iOS為UIViewController類添加了新的屬性和方法:

@property(nonatomic,readonly) NSArray *childViewControllers

-(void)addChildViewController:(UIViewController*)childController

-(void)removeFromParentViewController

-(void)transitionFromViewController::::::

-(void)willMoveToParentViewController:(UIViewController*)parent

-(void)didMoveToParentViewController:(UIViewController*)parent

這樣,就能夠將一個頁面中的UIViewController控制起來,而不是混亂的共用一個UIViewController ,最重要的是,程式設計習慣的革命:降低了功能的耦合度! 寫這篇部落格,僅僅是講以上5個方法!僅此而已。因為當我在百度或者谷歌中,輸入以上5個方法的名字後,查出來的,並沒有告訴這5個方法起到如何的作用?如何使用? 所以,我僅僅是想從API角度來談一談,這5個方法。 廢話不多說了! 先搞清楚一個今天提到的概念:

[父檢視控制器 addChildViewController

:子檢視控制器];

在此,圖控制器A添加了另一個圖控制器B,那麼A充當父檢視控制器,B充當子檢視控制器。父檢視控制器充當了檢視控制器容器的角色。 addChildViewController方法:

- (void)addChildViewController:(UIViewController *)childController

向檢視控制器容器中新增子檢視控制器

childController:子檢視控制器

當要新增的子檢視控制器已經包含在檢視控制器容器中,那麼,相當於先從父檢視控制器中刪除,然後重新新增到父檢視控制器中。

removeFromParentViewController方法

- (void)removeFromParentViewController

從父檢視控制器中刪除。

transitionFromViewController方法

- (void)transitionFromViewController:(UIViewController*)fromViewControllertoViewController:(UIViewController *)toViewControllerduration:(NSTimeInterval)durationoptions:(UIViewAnimationOptions)optionsanimations:(void (^)(void))animationscompletion:(void (^)(BOOL finished))completion

交換兩個子檢視控制器的位置(由於新增的順序不同,所以子試圖控制器在父檢視控制器中存在層次關係)

fromViewController:當前顯示的子試圖控制器,將被替換為非顯示狀態

toViewController:將要顯示的子檢視控制器

duration:交換動畫持續的時間,單位秒

options:動畫的方式

animations:動畫Block

completion:完成後執行的Block

willMoveToParentViewController方法

- (void)willMoveToParentViewController:(UIViewController*)parent

當一個檢視控制器從檢視控制器容器中被新增或者被刪除之前,該方法被呼叫

parent:父檢視控制器,如果沒有父檢視控制器,將為nil

注意點:

1.當我們向我們的檢視控制器容器中呼叫removeFromParentViewController方法時,必須要先呼叫該方法,且parent引數為nil:

[將要刪除的檢視控制器 willMoveToParentViewController:nil];

2.當我們呼叫addChildViewController方法時,在新增子檢視控制器之前將自動呼叫該方法。所以,就不需要我們顯示呼叫了。

didMoveToParentViewController方法

- (void)didMoveToParentViewController:(UIViewController*)parent

當從一個檢視控制容器中新增或者移除viewController後,該方法被呼叫。

parent:父檢視控制器,如果沒有父檢視控制器,將為nil

當我們向我們的檢視控制器容器(就是父檢視控制器,它呼叫addChildViewController方法加入子檢視控制器,它就成為了檢視控制器的容器)中新增(或者刪除)子檢視控制器後,必須呼叫該方法,告訴iOS,已經完成新增(或刪除)子控制器的操作。

removeFromParentViewController方法會自動呼叫了該方法,所以,刪除子控制器後,不需要在顯示的呼叫該方法了。

其實,這幾個方法中的API說明,看的還懂。 最後, 關於willMoveToParentViewController方法和didMoveToParentViewController方法的使用 1.這兩個方法用在子試圖控制器交換的時候呼叫!即呼叫transitionFromViewController方法時,呼叫。 2.當呼叫willMoveToParentViewController方法或didMoveToParentViewController方法時,要注意他們的引數使用: 當某個子檢視控制器將從父檢視控制器中刪除時,parent引數為nil。 即:[將被刪除的子試圖控制器 willMoveToParentViewController:nil]; 當某個子試圖控制器將加入到父檢視控制器時,parent引數為父檢視控制器。 即:[將被加入的子檢視控制器 didMoveToParentViewController:父檢視控制器]; 3.無需呼叫[子檢視控制器willMoveToParentViewController:父檢視控制器]方法。因為我們呼叫[父檢視控制器addChildViewController:子檢視控制器]時,已經預設呼叫了。 只需要在transitionFromViewController方法後,呼叫[子檢視控制器didMoveToParentViewController:父檢視控制器]; 4.無需呼叫[子檢視控制器 didMoveToParentViewController:父檢視控制器]方法。因為我們呼叫 [子檢視控制器 removeFromParentViewController]時,已經預設呼叫了。 只需要在transitionFromViewController方法之前呼叫:[子檢視控制器 willMoveToParentViewController:nil]。 希望對你有所幫助!