willMoveToParentViewController和didMoveToParentView

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

在之前,一個UIViewController的View可能有不少小的子view。這些子view不少時候被蓋在最後,咱們在最外層ViewController的viewDidLoad方法中,用addSubview增長了大量的子view。這些子view大多數不會一直處於界面上,只是在某些狀況下才會出現,例如登錄失敗的提示view,上傳附件成功的提示view,網絡失敗的提示view等。可是雖然這些view不多出現,可是咱們卻經常一直把它們放在內存中。另外,當收到內存警告時,咱們只能本身手工把這些view從super view中去掉。 編程

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

@property(nonatomic,readonly) NSArray *childViewControllers 網絡

- (void)addChildViewController:(UIViewController *)childController 動畫

- (void) removeFromParentViewController atom

- (void)transitionFromViewController:::::: spa

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

- (void)didMoveToParentViewController:(UIViewController *)parent 內存


這樣,就可以將一個頁面中的 UIViewController控制起來,而不是混亂的共用一個 UIViewController
,最重要的是,編程習慣的革命: 下降了功能的耦合度!

寫這篇博客,僅僅是講以上5個方法!僅此而已。由於當我在百度或者谷歌中,輸入以上5個方法的名字後,查出來的,並無告訴這5個方法起到如何的做用?如何使用?

因此,我僅僅是想從API角度來談一談,這5個方法。
廢話很少說了!

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

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


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

addChildViewController方法:

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

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


childController:子視圖控制器


當要添加的子視圖控制器已經包含在視圖控制器容器中,那麼,至關於先從父視圖控制器中刪除,而後從新添加到父視圖控制器中。


removeFromParentViewController 方法

- (void)removeFromParentViewController

從父視圖控制器中刪除。


transitionFromViewController 方法

- (void)transitionFromViewController:(UIViewController *)fromViewControllertoViewController:(UIViewController *)toViewController duration:(NSTimeInterval)durationoptions:(UIViewAnimationOptions)options animations:(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]。

但願對你有所幫助!
相關文章
相關標籤/搜索