addChildViewController 等5個方法使用

iOS 5.0 后UIViewController新增:willMoveToParentViewController和didMoveToParentViewController

在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個方法预麸!僅此而已。因?yàn)楫?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 *)toViewController duration:(NSTimeInterval)duration options:(UIViewAnimationOptions)options animations:(void (^)(void))animations completion:(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

注意點(diǎn):
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)用該方法了资柔。
其實(shí),這幾個方法中的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:父視圖控制器]方法捐晶。因?yàn)槲覀冋{(diào)用[父視圖控制器 addChildViewController:子視圖控制器]時菲语,已經(jīng)默認(rèn)調(diào)用了。
只需要在transitionFromViewController方法后惑灵,調(diào)用[子視圖控制器didMoveToParentViewController:父視圖控制器];

4.無需調(diào)用[子視圖控制器 didMoveToParentViewController:父視圖控制器]方法山上。因?yàn)槲覀冋{(diào)用
[子視圖控制器 removeFromParentViewController]時,已經(jīng)默認(rèn)調(diào)用了英支。
只需要在transitionFromViewController方法之前調(diào)用:[子視圖控制器 willMoveToParentViewController:nil]佩憾。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子妄帘,更是在濱河造成了極大的恐慌楞黄,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件抡驼,死亡現(xiàn)場離奇詭異鬼廓,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)致盟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進(jìn)店門碎税,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人勾邦,你說我怎么就攤上這事蚣录。” “怎么了眷篇?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵萎河,是天一觀的道長。 經(jīng)常有香客問我蕉饼,道長虐杯,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任昧港,我火速辦了婚禮擎椰,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘创肥。我一直安慰自己达舒,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布叹侄。 她就那樣靜靜地躺著巩搏,像睡著了一般。 火紅的嫁衣襯著肌膚如雪趾代。 梳的紋絲不亂的頭發(fā)上贯底,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天,我揣著相機(jī)與錄音撒强,去河邊找鬼禽捆。 笑死,一個胖子當(dāng)著我的面吹牛飘哨,可吹牛的內(nèi)容都是我干的胚想。 我是一名探鬼主播,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼杖玲,長吁一口氣:“原來是場噩夢啊……” “哼顿仇!你這毒婦竟也來了淘正?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤臼闻,失蹤者是張志新(化名)和其女友劉穎鸿吆,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體述呐,經(jīng)...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡惩淳,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了乓搬。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片思犁。...
    茶點(diǎn)故事閱讀 40,664評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖进肯,靈堂內(nèi)的尸體忽然破棺而出激蹲,到底是詐尸還是另有隱情,我是刑警寧澤江掩,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布学辱,位于F島的核電站,受9級特大地震影響环形,放射性物質(zhì)發(fā)生泄漏策泣。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一抬吟、第九天 我趴在偏房一處隱蔽的房頂上張望萨咕。 院中可真熱鬧,春花似錦火本、人聲如沸危队。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽交掏。三九已至,卻和暖如春刃鳄,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背钱骂。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工叔锐, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人见秽。 一個月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓愉烙,卻偏偏與公主長得像,于是被迫代替她去往敵國和親解取。 傳聞我的和親對象是個殘疾皇子步责,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評論 2 359

推薦閱讀更多精彩內(nèi)容