iOS開發(fā)中常用的視圖切換

想一步一步的留個(gè)腳印*
想一步一步的留個(gè)腳印*

今天又是周五了一天天的過得好快氧急,這句總是情不自禁的感嘆拐叉!下面給大家分享下視圖的切換,其實(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é)合使用
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末沛硅,一起剝皮案震驚了整個(gè)濱河市眼刃,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌摇肌,老刑警劉巖擂红,帶你破解...
    沈念sama閱讀 206,602評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異围小,居然都是意外死亡昵骤,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評論 2 382
  • 文/潘曉璐 我一進(jìn)店門肯适,熙熙樓的掌柜王于貴愁眉苦臉地迎上來变秦,“玉大人,你說我怎么就攤上這事框舔”拿担” “怎么了?”我有些...
    開封第一講書人閱讀 152,878評論 0 344
  • 文/不壞的土叔 我叫張陵刘绣,是天一觀的道長樱溉。 經(jīng)常有香客問我,道長纬凤,這世上最難降的妖魔是什么福贞? 我笑而不...
    開封第一講書人閱讀 55,306評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮停士,結(jié)果婚禮上挖帘,老公的妹妹穿的比我還像新娘完丽。我一直安慰自己,他們只是感情好拇舀,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,330評論 5 373
  • 文/花漫 我一把揭開白布逻族。 她就那樣靜靜地躺著,像睡著了一般你稚。 火紅的嫁衣襯著肌膚如雪瓷耙。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,071評論 1 285
  • 那天刁赖,我揣著相機(jī)與錄音搁痛,去河邊找鬼。 笑死宇弛,一個(gè)胖子當(dāng)著我的面吹牛鸡典,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播枪芒,決...
    沈念sama閱讀 38,382評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼彻况,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了舅踪?” 一聲冷哼從身側(cè)響起纽甘,我...
    開封第一講書人閱讀 37,006評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎抽碌,沒想到半個(gè)月后悍赢,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,512評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡货徙,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,965評論 2 325
  • 正文 我和宋清朗相戀三年左权,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片痴颊。...
    茶點(diǎn)故事閱讀 38,094評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡赏迟,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蠢棱,到底是詐尸還是另有隱情锌杀,我是刑警寧澤,帶...
    沈念sama閱讀 33,732評論 4 323
  • 正文 年R本政府宣布泻仙,位于F島的核電站抛丽,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏饰豺。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,283評論 3 307
  • 文/蒙蒙 一允蜈、第九天 我趴在偏房一處隱蔽的房頂上張望冤吨。 院中可真熱鬧蒿柳,春花似錦、人聲如沸漩蟆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽怠李。三九已至圾叼,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間捺癞,已是汗流浹背夷蚊。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留髓介,地道東北人惕鼓。 一個(gè)月前我還...
    沈念sama閱讀 45,536評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像唐础,于是被迫代替她去往敵國和親箱歧。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,828評論 2 345

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