willMoveToParentViewController和didMoveToParentViewCon

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

在以前,一個UIViewController的View可能有很多小的子view。這些子view很多時候被蓋在最后,我們在最外層ViewController的viewDidLoad方法中,用addSubview增加了大量的子view。這些子view大多數(shù)不會一直處于界面上,只是在某些情況下才會出現(xiàn),例如登陸失敗的提示view,上傳附件成功的提示view,網(wǎng)絡(luò)失敗的提示view等。但是雖然這些view很少出現(xiàn),但是我們卻常常一直把它們放在內(nèi)存中。另外,當(dāng)收到內(nèi)存警告時,我們只能自己手工把這些view從super view中去掉。

在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

這樣,就能夠?qū)⒁粋€頁面中的UIViewController控制起來,而不是混亂的共用一個UIViewController

,最重要的是,編程習(xí)慣的革命:降低了功能的耦合度!

寫這篇博客,僅僅是講以上5個方法!僅此而已。因為當(dāng)我在百度或者谷歌中,輸入以上5個方法的名字后,查出來的,并沒有告訴這5個方法起到如何的作用?如何使用?

所以,我僅僅是想從API角度來談一談,這5個方法。

廢話不多說了!

先搞清楚一個今天提到的概念:

[父視圖控制器addChildViewController:子視圖控制器];

在此,圖控制器A添加了另一個圖控制器B,那么A充當(dāng)父視圖控制器,B充當(dāng)子視圖控制器。父視圖控制器充當(dāng)了視圖控制器容器的角色。

addChildViewController方法:

- (void)addChildViewController:(UIViewController *)childController

向視圖控制器容器中添加子視圖控制器

childController:子視圖控制器

當(dāng)要添加的子視圖控制器已經(jīng)包含在視圖控制器容器中,那么,相當(dāng)于先從父視圖控制器中刪除,然后重新添加到父視圖控制器中。

removeFromParentViewController 方法

- (void)removeFromParentViewController

從父視圖控制器中刪除。

transitionFromViewController 方法

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

交換兩個子視圖控制器的位置(由于添加的順序不同,所以子試圖控制器在父視圖控制器中存在層次關(guān)系)

fromViewController:當(dāng)前顯示的子試圖控制器,將被替換為非顯示狀態(tài)

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

duration:交換動畫持續(xù)的時間,單位秒

options:動畫的方式

animations:動畫Block

completion:完成后執(zhí)行的Block

willMoveToParentViewController 方法

- (void)willMoveToParentViewController:(UIViewController *)parent

當(dāng)一個視圖控制器從視圖控制器容器中被添加或者被刪除之前,該方法被調(diào)用

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

注意點:

1.當(dāng)我們向我們的視圖控制器容器中調(diào)用removeFromParentViewController方法時,必須要先調(diào)用該方法,且parent參數(shù)為nil:

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

2.當(dāng)我們調(diào)用addChildViewController方法時,在添加子視圖控制器之前將自動調(diào)用該方法。所以,就不需要我們顯示調(diào)用了。

didMoveToParentViewController 方法

- (void)didMoveToParentViewController:(UIViewController *)parent

當(dāng)從一個視圖控制容器中添加或者移除viewController后,該方法被調(diào)用。

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

當(dāng)我們向我們的視圖控制器容器(就是父視圖控制器,它調(diào)用addChildViewController方法加入子視圖控制器,它就成為了視圖控制器的容器)中添加(或者刪除)子視圖控制器后,必須調(diào)用該方法,告訴iOS,已經(jīng)完成添加(或刪除)子控制器的操作。

removeFromParentViewController方法會自動調(diào)用了該方法,所以,刪除子控制器后,不需要在顯示的調(diào)用該方法了。

其實,這幾個方法中的API說明,看的還懂。

最后,

關(guān)于willMoveToParentViewController方法和didMoveToParentViewController方法的使用

1.這兩個方法用在子試圖控制器交換的時候調(diào)用!即調(diào)用transitionFromViewController 方法時,調(diào)用。

2.當(dāng)調(diào)用willMoveToParentViewController方法或didMoveToParentViewController方法時,要注意他們的參數(shù)使用:

當(dāng)某個子視圖控制器將從父視圖控制器中刪除時,parent參數(shù)為nil。

即:[將被刪除的子試圖控制器willMoveToParentViewController:nil];

當(dāng)某個子試圖控制器將加入到父視圖控制器時,parent參數(shù)為父視圖控制器。

即:[將被加入的子視圖控制器didMoveToParentViewController:父視圖控制器];

3.無需調(diào)用[子視圖控制器willMoveToParentViewController:父視圖控制器]方法。因為我們調(diào)用[父視圖控制器addChildViewController:子視圖控制器]時,已經(jīng)默認(rèn)調(diào)用了。

只需要在transitionFromViewController方法后,調(diào)用[子視圖控制器didMoveToParentViewController:父視圖控制器];

4.無需調(diào)用[子視圖控制器didMoveToParentViewController:父視圖控制器]方法。因為我們調(diào)用

[子視圖控制器removeFromParentViewController]時,已經(jīng)默認(rèn)調(diào)用了。

只需要在transitionFromViewController方法之前調(diào)用:[子視圖控制器willMoveToParentViewController:nil]。

希望對你有所幫助!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容