今天又是周五了一天天的過得好快氧急,這句總是情不自禁的感嘆拐叉!下面給大家分享下視圖的切換,其實(shí)這是我們的基本功萄焦,只是有時(shí)候面試了或者同事交流的時(shí)候感覺回答的不夠系統(tǒng)控轿,全面。
我們常見的視圖切換有人說三種拂封,有人說四種茬射,我就把平時(shí)用到的都總結(jié)下:
UIViewController、UINavigationController, UITabBarController之間的關(guān)系
UIViewController 是所有控制器的基類冒签,UINavigationController, UITabBarController 都是直接或間接繼承自UIViewController. 只是它們在UIVIewController的基礎(chǔ)上又?jǐn)U展了自己的實(shí)現(xiàn)在抛。
UINavigationController: 導(dǎo)航控制器, 它是一個(gè)容器控制器萧恕,自身實(shí)現(xiàn)了它包含的所有子控制器之間的轉(zhuǎn)場刚梭。 pushViewController(壓棧) ,popViewController(出棧)票唆∑佣粒可見導(dǎo)航控制器,它維護(hù)了一個(gè)控制器棧走趋,控制器之間的關(guān)系也符合棧的特點(diǎn)“后進(jìn)先出”衅金。 UITabBarController: 標(biāo)簽控制器, 它也是一個(gè)容器控制器簿煌,以平行的方式管理視圖氮唯。
常見的視圖切換
- 1 UINavigationController 的push、pop
UINavigationController 以棧的方式管理視圖姨伟,各個(gè)視圖的切換就是壓棧和出棧操作惩琉,出棧后的視圖會立即銷毀,默認(rèn)顯示一個(gè)根控制器授滓,根控制器是不會被銷毀的琳水,這個(gè)根視圖必須指定,通過根控制器導(dǎo)航到其他下一級子視圖肆糕。在子視圖中可以通過navigationController訪問導(dǎo)航控制器,同時(shí)可以通過navigationController的childViewControllers獲得當(dāng)前棧中所有的子視圖(注意每一個(gè)出棧的子視圖都會被銷毀)在孝。UINavigationController導(dǎo)航是通過上方導(dǎo)航欄進(jìn)行的诚啃,每個(gè)放到UINavigationController棧中的子視圖都會顯示一個(gè)導(dǎo)航欄,可以通過子控制器(包括根控制器) 的navigationItem訪問這個(gè)導(dǎo)航欄私沮,修改其左右兩邊的按鈕內(nèi)容始赎。
- 2 UITabBarController
UITabBarController以平行的方式管理視圖,各個(gè)視圖之間往往關(guān)系并不大仔燕,每個(gè)加入到UITabBarController的視圖都會進(jìn)行初始化即使當(dāng)前不顯示在界面上造垛,相對比較占用內(nèi)存。是Apple專門為了利用頁簽切換視圖而設(shè)計(jì)的晰搀,在這個(gè)視圖控制器中有一個(gè)UITabBar控件五辽,用戶通過點(diǎn)擊tabBar進(jìn)行視圖切換。我們知道在UIViewController內(nèi)部有一個(gè)視圖外恕,一旦創(chuàng)建了UIViewController之后默認(rèn)就會顯示這個(gè)視圖杆逗,但是UITabBarController本身并不會顯示任何視圖,如果要顯示視圖則必須設(shè)置其viewControllers屬性(它默認(rèn)顯示viewControllers[0])鳞疲。這個(gè)屬性是一個(gè)數(shù)組罪郊,它維護(hù)了所有UITabBarController的子視圖。為了盡可能減少視圖之間的耦合尚洽,所有的UITabBarController的子視圖的相關(guān)標(biāo)題悔橄、圖標(biāo)等信息均由子視圖自己控制,UITabBarController僅僅作為一個(gè)容器存在腺毫。
- 3 切換window的rootViewController
self.window.rootViewController=viewController; //從一個(gè)界面彈到另一個(gè)界面癣疟,直接設(shè)置根視圖
- 4 modal模態(tài)彈出
[self presentViewController:ViewController animated:YES completion:nil]; //跳轉(zhuǎn)到ViewController所在視圖
[self dismissModalViewControllerAnimated:YES]; //退出當(dāng)前視圖
- 5 將另一個(gè)控制器的視圖添加為當(dāng)前控制器視圖的子視圖
[self.view addSubview: ViewController.View]; //實(shí)現(xiàn)復(fù)雜界面的時(shí)候常用
切換制圖控制器方式之間優(yōu)點(diǎn)和缺點(diǎn)
1、push拴曲、pop方式
優(yōu)點(diǎn):控制器切換是可逆的争舞,且最初的根視圖不會銷毀
缺點(diǎn):依賴于UINavigationController,故需要有一個(gè)導(dǎo)航控制器澈灼,與某些界面不需要導(dǎo)航控制器有可能會沖突
push操作是可逆的,即控制器的切換時(shí)可逆的店溢。2叁熔、modal
優(yōu)點(diǎn):控制器切換是可逆的,且原始圖不會銷毀
缺點(diǎn):跳轉(zhuǎn)沒有push方式自由床牧,dismiss方式只能按順序返回荣回,不能跳躍, 從前一個(gè)modal到后一個(gè)時(shí)候戈咳,前一個(gè)控制器不會消失心软,一直在內(nèi)存中3壕吹、切換window的rootViewController
優(yōu)點(diǎn):跳轉(zhuǎn)直接迅速,而且可以銷毀前一個(gè)控制器删铃,因?yàn)閷indow的強(qiáng)引用改為當(dāng)前控制器耳贬,故前一個(gè)控制器會消失(ARC環(huán)境)
缺點(diǎn):視圖跳轉(zhuǎn)不可逆4、將一個(gè)控制器的視圖添加到當(dāng)前視圖上面
優(yōu)點(diǎn):通過一個(gè)控制器將另一控制器設(shè)置為屬性猎唁,自由讀取其他控制器中的視圖從而能夠?qū)崿F(xiàn)復(fù)雜UI界面
缺點(diǎn):復(fù)雜咒劲,多數(shù)場合不適用5 tabBar
優(yōu)點(diǎn): UITabBarController也可以輕松地管理多個(gè)控制器,輕松完成控制器之間的切換,典型的例子就是QQ、微信等應(yīng)?诫隅,所有的UITabBarController的子視圖的相關(guān)標(biāo)題腐魂、圖標(biāo)等信息均由子視圖自己控制,UITabBarController僅僅作為一個(gè)容器存在逐纬。
缺點(diǎn):每個(gè)加入到UITabBarController的視圖都會進(jìn)行初始化即使當(dāng)前不顯示在界面上蛔屹,相對比較占用內(nèi)存。
比較的項(xiàng)目 | push豁生、pop | modal | 切換窗口的根控制器 | 添加子視圖 | UITabBarController |
---|---|---|---|---|---|
銷毀資源 | 否 | 否 | 是 | 否 | 否 |
使用場合 | 有導(dǎo)航控制器兔毒,需要能夠返回前一個(gè)視圖的情況 | 沒有導(dǎo)航控制器的跳轉(zhuǎn),能返回前一個(gè)視圖 | 版本新特性或者不需要保留前一個(gè)控制器的情況 | 需要實(shí)現(xiàn)復(fù)雜界面的情況 | 與導(dǎo)航控制器結(jié)合使用 |
是否有導(dǎo)航控制器 | 是 | 否 | 否 | 否 | 一般與導(dǎo)航控制器結(jié)合使用 |