addChildViewController講解(一)

參考:http://blog.devtang.com/2012/02/06/new-methods-in-uiviewcontroller-of-ios5/

1. addChildViewController的由來

在蘋果的WWDC2011大會視頻的 《Session 101 - What’s New in Cocoa》 和 《Session 102 - Implementing UIViewController Containment》 中介紹了蘋果在iOS5中給UIViewController新增加的5方法以及一個屬性:

// 方法
addChildViewController:
removeFromParentViewController:
transitionFromViewController:toViewController:duration:options:animations:completion:
willMoveToParentViewController:
didMoveToParentViewController:

// 屬性
@property(nonatomic,readonly) NSArray *childViewControllers

原來的問題

這些新增的方法和屬性用于改進我們的編程方式。那么讓我們先看看以前的對于UIViewController的使用有什么潛在的問題,認清問題,我們才能理解蘋果改變的意義。

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


改變

蘋果新的API增加了addChildViewController方法,并且希望我們在使用addSubview時,同時調用[self addChildViewController:child]方法將sub view對應的viewController也加到當前ViewController的管理中。對于那些當前暫時不需要顯示的subview,只通過addChildViewController把subViewController加進去。需要顯示時再調用transitionFromViewController:toViewController:duration:options:animations:completion方法。

另外,當收到系統(tǒng)的Memory Warning的時候,系統(tǒng)也會自動把當前沒有顯示的subview unload掉,以節(jié)省內存。

Posted by 唐巧 Feb 6th, 2012 iOS


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

注意點:

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

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

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

didMoveToParentViewController 方法

3.當從一個視圖控制容器中添加或者移除viewController后,該方法被調用。

-(void)didMoveToParentViewController:(UIViewController *)parent
parent:父視圖控制器,如果沒有父視圖控制器,將為nil

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

4.關于willMoveToParentViewController方法和didMoveToParentViewController方法的使用

  • 這兩個方法用在子試圖控制器交換的時候調用!即調用transitionFromViewController 方法時,調用。

  • 當調用willMoveToParentViewController方法或didMoveToParentViewController方法時,要注意他們的參數(shù)使用:

    當某個子視圖控制器將從父視圖控制器中刪除時,parent參數(shù)為nil。即:[將被刪除的子試圖控制器 willMoveToParentViewController:nil];

當某個子試圖控制器將加入到父視圖控制器時,parent參數(shù)為父視圖控制器。即:[將被加入的子視圖控制器 didMoveToParentViewController:父視圖控制器];


3.無需調用[子視圖控制器 willMoveToParentViewController:父視圖控制器]方法。因為我們調用[父視圖控制器 addChildViewController:子視圖控制器]時,已經默認調用了。

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


4.無需調用[子視圖控制器 didMoveToParentViewController:父視圖控制器]方法。因為我們調用[子視圖控制器 removeFromParentViewController]時,已經默認調用了。

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

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

相關閱讀更多精彩內容

友情鏈接更多精彩內容