UIViewController的四種切換模式

presentViewController:

使用場(chǎng)景
  • 模態(tài)的展現(xiàn)另一個(gè)UIViewController
基本用法(OC)
    [viewControllerA presentViewController:viewcontrollerB animated:YES completion:^{
        NSLog(@"從viewControllerA切換到viewControllerB");  
    ];

注意侯繁,這個(gè)completion block是當(dāng)viewControllerB的viewDidAppear方法執(zhí)行完畢之后疹味,執(zhí)行的术徊。

多說(shuō)點(diǎn)
  1. viewController有兩個(gè)屬性跟這個(gè)方法關(guān)聯(lián)盖腕,一個(gè)是presentedViewController钝域,一個(gè)是presentingViewController.就拿上面的例子來(lái)說(shuō),
    viewControllerA.presentedViewController = viewControllerB,
    viewControllerB.presentingViewController = viewControllerA
    這個(gè)關(guān)系執(zhí)行presentViewController時(shí)就確定了舶胀。

  2. 當(dāng)你需要從B跳轉(zhuǎn)回A時(shí)概说,在B調(diào)用以下方法即可
    [viewControllerB dismissViewControllerAnimation:YES completion:^{
    NSLog(@"從viewControllerB切回到viewControllerA");
    ];

  3. 如果你接連presentViewController多次呢碧注?比如嚣伐,A->B->C->D,這個(gè)時(shí)候會(huì)有一個(gè)棧,A處于棧底萍丐,D處于棧頂轩端。當(dāng)你需要從D跳轉(zhuǎn)到A時(shí),需要在A中調(diào)用dismissViewControllerAnimation:,這樣D會(huì)執(zhí)行dismiss animation逝变,而B(niǎo)基茵,C,D都會(huì)從占中移除壳影。

transitionFromViewController

使用背景
  • 用于container viewController的兩個(gè)子view controller之間的切換
基本用法

若viewControllerA有兩個(gè)childViewController拱层, viewControllerB跟viewControllerD,當(dāng)前viewControllerB的view在父ViewController的View層級(jí)中宴咧。

      [viewControllerA transitionFromViewController:viewControllerB 
                                   toViewController:viewControllerA 
                                           duration:0.25                 
                                           opitions:UIViewAnimationOpitionsNone 
                                         animations:NO 
                                          completion:^{
                NSLog(@"viewControllerB從A中移除根灯,viewControllerD在A中");
      ];
多說(shuō)點(diǎn)
  1. 在A中,依次從B轉(zhuǎn)到了C掺栅,再轉(zhuǎn)到了D烙肺。那么銷毀的順序則是,D氧卧,C桃笙,B,A沙绝,很像棧的順序搏明。
  2. 其實(shí)這個(gè)方法的就是把當(dāng)前ViewController的view從父viewController的view層級(jí)中移除鼠锈,添加上to viewController的view。
  3. 跟這個(gè)方法關(guān)聯(lián)的屬性說(shuō)兩個(gè)吧星著。一個(gè)是parentViewController脚祟,如viewControllerB的parentViewController是viewControllerA。一個(gè)是childViewControllers强饮,這個(gè)屬性是一個(gè)數(shù)組由桌,包含所有viewControllerA的child viewController。
  4. 還有其他兩個(gè)方法也很重要邮丰。一個(gè)是addChildViewController行您,添加child ViewController,如
    [viewControllerA addChildViewController:viewControllerB];
    一個(gè)是removeFromParentViewController剪廉,如:
    [childViewControllerB removeFromParentViewController];

UINavigationController

使用背景

UINavigationController是一個(gè)很重要的ViewController容器娃循。完全可以單寫(xiě)一篇文章來(lái)解析。但是今天只說(shuō)viewController之間的切換吧斗蒋。UINavigationController管理了ViewController之間的層級(jí)關(guān)系捌斧,依照棧的模式來(lái)工作∪矗可以參照下iPhone中的設(shè)置應(yīng)用捞蚂,一層一層往下跳轉(zhuǎn)。

基本用法

假設(shè)有UINavigationController A跷究, UIViewController B姓迅,C,D俊马,A初始化的時(shí)候指定rootViewController為 B丁存。

  • 從B跳轉(zhuǎn)到C ,C跳轉(zhuǎn)到D

      [B.navigationController pushViewController:C animated:YES];
    

C入棧

    [C.navigationController pushViewController:D animated:YES];

D入棧

  • 彈出D柴我,D出棧
    [D.navigationController popViewControllerAnimated:YES];

  • 直接跳轉(zhuǎn)到rootViewController
    [D.navigationController popToRootViewControllerAnimated:YES];

  • 跳轉(zhuǎn)到棧中已存在的某個(gè)ViewController

        [D.navigationController popToViewController:B animated:YES];
    
多說(shuō)點(diǎn)
  1. UINavigationController繼承自UiViewController解寝,扮演導(dǎo)航控制器的角色。你呈現(xiàn)的是他的rootViewController艘儒,并維護(hù)一個(gè)stack聋伦,可以訪問(wèn)viewControllers屬性獲取其棧中的viewController。

  2. UIViewController有一個(gè)navigationController的屬性彤悔,指向其所屬的導(dǎo)航控制器嘉抓。

  3. 導(dǎo)航控制器還有兩個(gè)有意思的組件,一個(gè)是導(dǎo)航欄晕窑,一個(gè)是底部工具欄抑片,這個(gè)以后專門寫(xiě)一篇文章來(lái)說(shuō)吧。

UITabBarController

使用背景

像微信那種杨赤,應(yīng)用底部會(huì)有<=5個(gè)的按鈕的使用場(chǎng)景敞斋。這種應(yīng)用也很常見(jiàn)截汪。一般情況下我們只需要初始化UITabBarController的每個(gè)tab對(duì)應(yīng)的root view controller,那么點(diǎn)擊底部tab的時(shí)候植捎,就會(huì)自動(dòng)跳轉(zhuǎn)到每個(gè)tab對(duì)應(yīng)的root view衙解。UITabBarController也是繼承自UIViewController,他的root view 可以分為兩個(gè)模塊焰枢,一個(gè)是底部的tab bar蚓峦,一個(gè)是底部上層的content view,點(diǎn)擊tab時(shí)济锄,就會(huì)看到content view 中的view之間的切換暑椰。

基本用法

這里的基本用法就是關(guān)于UITabBarController的一些初始化了。UITabBarController有一個(gè)viewControllers的屬性荐绝,是每個(gè)tab對(duì)應(yīng)的UIViewController的數(shù)組一汽,每個(gè)viewController包含一個(gè)UITabBarItem的屬性,定義每個(gè)tab的title低滩,image召夹,badgeValue等屬性。badgeValue就像微信消息那個(gè)tab對(duì)應(yīng)的未讀消息數(shù)恕沫。

    viewController1.tabBarItem = [[UITabBarItem alloc] initWithTitle:@"One" 
                                                               image:nil 
                                                                 tag:1];

    viewController2.tabBarItem = [[UITabBarItem alloc] initWithTitle:@"Second" 
                                                               image:nil 
                                                                 tag:2];
    tabBarController.viewControllers = [NSArray arrayWithObjects:viewController1,viewController2,nil];
多說(shuō)點(diǎn)
  1. UITabBarController的viewControllers是copy屬性监憎,UINavigationController中的viewControllers是readonly。畢竟在UITabBarController中昏兆,viewControllers是暴露給外界添加child view controller的唯一接口枫虏。后期不知道蘋(píng)果會(huì)不會(huì)對(duì)UITabBarController的公共接口迭代更新。

  2. 在UITabBarController中爬虱,可以通過(guò)selectedViewController,selectedIndex兩個(gè)屬性獲取當(dāng)前選中的viewController腾它。

  3. 在項(xiàng)目中跑筝,UITabBarController跟UINavigationContorller經(jīng)常會(huì)搭配使用,比如UITabBarController每個(gè)tab的rootViewController就是一個(gè)UINavigationController瞒滴。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子抄课,更是在濱河造成了極大的恐慌尝苇,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,884評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件世剖,死亡現(xiàn)場(chǎng)離奇詭異定罢,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)旁瘫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門祖凫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)琼蚯,“玉大人,你說(shuō)我怎么就攤上這事惠况≡馐” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 158,369評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵稠屠,是天一觀的道長(zhǎng)峦睡。 經(jīng)常有香客問(wèn)我,道長(zhǎng)权埠,這世上最難降的妖魔是什么赐俗? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,799評(píng)論 1 285
  • 正文 為了忘掉前任,我火速辦了婚禮弊知,結(jié)果婚禮上阻逮,老公的妹妹穿的比我還像新娘。我一直安慰自己秩彤,他們只是感情好叔扼,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,910評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著漫雷,像睡著了一般瓜富。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上降盹,一...
    開(kāi)封第一講書(shū)人閱讀 50,096評(píng)論 1 291
  • 那天与柑,我揣著相機(jī)與錄音,去河邊找鬼蓄坏。 笑死价捧,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的涡戳。 我是一名探鬼主播结蟋,決...
    沈念sama閱讀 39,159評(píng)論 3 411
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼渔彰!你這毒婦竟也來(lái)了嵌屎?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,917評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤恍涂,失蹤者是張志新(化名)和其女友劉穎宝惰,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體再沧,經(jīng)...
    沈念sama閱讀 44,360評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡尼夺,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,673評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片汞斧。...
    茶點(diǎn)故事閱讀 38,814評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡夜郁,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出粘勒,到底是詐尸還是另有隱情竞端,我是刑警寧澤,帶...
    沈念sama閱讀 34,509評(píng)論 4 334
  • 正文 年R本政府宣布庙睡,位于F島的核電站事富,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏乘陪。R本人自食惡果不足惜统台,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,156評(píng)論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望啡邑。 院中可真熱鬧贱勃,春花似錦、人聲如沸谤逼。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)流部。三九已至戚绕,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間枝冀,已是汗流浹背舞丛。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,123評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留果漾,地道東北人球切。 一個(gè)月前我還...
    沈念sama閱讀 46,641評(píng)論 2 362
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像跨晴,于是被迫代替她去往敵國(guó)和親欧聘。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,728評(píng)論 2 351

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

  • *7月8日上午 N:Block :跟一個(gè)函數(shù)塊差不多端盆,會(huì)對(duì)里面所有的內(nèi)容的引用計(jì)數(shù)+1,想要解決就用__block...
    炙冰閱讀 2,477評(píng)論 1 14
  • 廢話不多說(shuō)费封,直接上干貨 ---------------------------------------------...
    小小趙紙農(nóng)閱讀 3,345評(píng)論 0 15
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)焕妙、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,066評(píng)論 4 62
  • 子衿從小便是弱小和隱忍弓摘,這與原生家庭的關(guān)系密不可分焚鹊,今天卻不講這個(gè),因?yàn)樽玉埔呀?jīng)不惑之年韧献,歲月和經(jīng)歷使她成長(zhǎng)末患,她開(kāi)...
    活著不易閱讀 769評(píng)論 5 9
  • 來(lái)住了將近兩年的房子收拾東西研叫,這是我和老公的第一個(gè)小家,這里見(jiàn)證了我們奮斗的開(kāi)始璧针,見(jiàn)證了我們從戀愛(ài)到結(jié)婚的過(guò)程嚷炉,見(jiàn)...
    粉四閱讀 151評(píng)論 0 0