多控制器之間的跳轉(zhuǎn)

1> 什么是多控制器之間的跳轉(zhuǎn)?
在一個(gè) APP 中,會(huì)存在多個(gè)控制器,多個(gè)控制器的存在就會(huì)存在控制器的跳轉(zhuǎn)問(wèn)題.
2> 包含:連線跳轉(zhuǎn),modal 方式以及navigationController/tabBarController方式
連線跳轉(zhuǎn):根據(jù)綁定的 ID 進(jìn)行控制器的跳轉(zhuǎn)
連線跳轉(zhuǎn)的分類:

自動(dòng)型:點(diǎn)擊控件后,自動(dòng)跳轉(zhuǎn)到下一個(gè)控制器(action – push 方式)
手動(dòng)型:需要借助于代碼手動(dòng)完成.
手動(dòng)型,是指從來(lái)源控制器拖到目標(biāo)控制器.(manual – push 方式),手動(dòng)型需要設(shè)置 storyboard segue 中的identify 標(biāo)記.手動(dòng)型要調(diào)用一下方法:
[self performSegueWithIdentifier:ID sender:nil];
系統(tǒng)會(huì)調(diào)用:

  • (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
    注:向下一個(gè)控制器順序傳遞數(shù)據(jù)可以在此方法中書寫.
    Modal 方式 該方式是系統(tǒng)默認(rèn)的方式,它是從系統(tǒng)底部往上走,覆蓋原來(lái)的控制器.
    使用步驟:
    1 創(chuàng)建要跳轉(zhuǎn)到的控制器
    2 跳轉(zhuǎn)和關(guān)閉
    [self presentViewController:創(chuàng)建的控制器]
    [self dismissViewControllerAnimated:YES]
    3 子控制器是在 dismisss 后會(huì)銷毀
    Push 和 pop 方式,該方法用于 navigationController 的跳轉(zhuǎn)
    使用步驟:
    1 創(chuàng)建要跳轉(zhuǎn)到的控制器
    注:使用該方式一定要注意設(shè)置根控制器.
    2 跳轉(zhuǎn)和退出
    [self.navigationController pushViewController:vc animated:YES];
    3 使用 UINavigationController 的時(shí)候, UINavigationController會(huì)給所有的目標(biāo)控制器套上導(dǎo)航條,完成 push 之后會(huì)自動(dòng)在導(dǎo)航條上生成一個(gè) item 返回按鈕,該按鈕可以直接返回到上一層的控制器.
    注: 使用UINavigationController設(shè)置導(dǎo)航欄的時(shí)候只需要設(shè)置一次,之后派生的導(dǎo)航欄都和根控制器的導(dǎo)航欄一樣.該導(dǎo)航欄的設(shè)置是在 initialize 方法中的設(shè)置外觀代理對(duì)象來(lái)完成的
    注: UITabBarController要把所有要跳轉(zhuǎn)的控制器一次性加載完成,它的子控制器的同時(shí)存在的,并不會(huì)因?yàn)樘D(zhuǎn)到其他子控制器而銷毀.加載子控制器的時(shí)候有兩種方式: addChildViewController:VC(加載一個(gè)子控制器). viewControllers(加載多個(gè)子控制器)其返回值是一個(gè)數(shù)組,可以將控制器直接加載到數(shù)組中并且要注意加載到數(shù)組中的順序就是加載到 tabBar 中的顯示的順序.
    3> 不同跳轉(zhuǎn)方式的區(qū)別
    1 push—pop 需要在 navigationController 中使用.方式是以棧的方式進(jìn)行控制器的跳轉(zhuǎn),進(jìn)棧的時(shí)候?qū)⑿逻M(jìn)來(lái)的控制器放在棧頂.是以側(cè)滑的方式進(jìn)入控制器
    -(void)pushViewController: (UIViewController *)
    viewController animated: (BOOL)animated;

退出的時(shí)候可以有三種方式
控制器進(jìn)入的時(shí)候是以進(jìn)棧的方式進(jìn)入的,即新進(jìn)入的控制器從右側(cè)進(jìn)入,將之前的控制器推到左側(cè),退出的時(shí)候?qū)m斂刂破髦苯右瞥?(注 tabbarController 中并不移除控制器,只是來(lái)回的切換.)
移除棧頂控制器: - (UIViewController *)popViewControllerAnimated 方法
回到指定的子控制器: -(NSArray *)popViewController 方法
回到根控制器
-(NSArray *)popToRootViewController 方法
2 modal 方式:
任何控制器都可以通過(guò) modal 方式來(lái)進(jìn)行跳轉(zhuǎn),是一個(gè)通用性的跳轉(zhuǎn)方式,其默認(rèn)效果是從下往上走,直到完全覆蓋上面的控制器.被覆蓋的控制器并沒(méi)有銷毀.
3 以 push 方式加載的控制器會(huì)在子控制器上加上一個(gè)返回按鈕,但 modal 方式不會(huì)自動(dòng)添加,返回按鈕要自己創(chuàng)建.
4 modal 出來(lái)的控制器將原來(lái)的控制器完全覆蓋,原來(lái)的控制器不可點(diǎn)擊. 而由于Push 控制器只是在navigationController 中 push 控制器.
4> 補(bǔ)充
4.1為了便于管理控制器扔字,iOS提供了2個(gè)比較特殊的控制器
UINavigationControlle UITabBarController.
4.1.2使用的時(shí)候一般用UITabBarController控制器作為窗口的根控制器,然后將UINavigationControlle 做為UITabBarController的根控制器,再加載所需控制器.
4.1.3設(shè)置窗口的根控制器步驟
一般通常在Appdelegate里面設(shè)置里
初始化一個(gè)窗口
設(shè)置窗口的根控制器為導(dǎo)航控制器
初始化導(dǎo)航控制器的時(shí)候一般要跟一個(gè)的控制器.
4.1.4 UINavigationControlle 的特點(diǎn)
棧中添加控制器,使用push操作,刪除控制器使用pop操作.
最先添加的控制器在棧底,而后添加的控制器則在上面,直接使用pop操作,是讓棧頂?shù)目刂破麂N毀了,可以指定pop的控制器.但是要注意控制器的循環(huán)引用.
push/pop 的方式是UINavigationControlle 獨(dú)有的方式,只有UINavigationControlle 和其子類才能夠使用該方式.
pop 控制器的時(shí)候可以有popViewController(返回到上一個(gè)控制器), popToViewController(返回到指定的控制器), popToRootViewController(返回到根控制器)三種.注:要獲取指定的控制器用遍歷的方式(XXX isKindOfXXX)
4.2 UITabBarController
4.2.1內(nèi)部實(shí)現(xiàn)原理:以平行的方式管理視圖鲫咽,各個(gè)視圖之間往往關(guān)系并不大,每個(gè)加入到UITabBarController的視圖都會(huì)進(jìn)行初始化即使當(dāng)前不顯示在界面上,相對(duì)比較占用內(nèi)存霍衫。通過(guò)給標(biāo)簽控制器的子控制器集合內(nèi)添加控制器,通過(guò)選中的(點(diǎn)擊操作)的索引進(jìn)行控制器的切換.標(biāo)簽控制器內(nèi)部也是擁有一個(gè)子控制器的集合的.
4.2.2 實(shí)現(xiàn)原理: UITabBarController是Apple專門為了利用頁(yè)簽切換視圖而設(shè)計(jì)的,在這個(gè)視圖控制器中有一個(gè)UITabBar控件螃概,用戶通過(guò)點(diǎn)擊tabBar進(jìn)行視圖切換政勃。我們知道在UIViewController內(nèi)部有一個(gè)視圖,一旦創(chuàng)建了UIViewController之后默認(rèn)就會(huì)顯示這個(gè)視圖旧乞,但是UITabBarController本身并不會(huì)顯示任何視圖蔚润,如果要顯示視圖則必須設(shè)置其viewControllers屬性(它默認(rèn)顯示viewControllers[0])。這個(gè)屬性是一個(gè)數(shù)組尺栖,它維護(hù)了所有UITabBarController的子視圖嫡纠。為了盡可能減少視圖之間的耦合,所有的UITabBarController的子視圖的相關(guān)標(biāo)題延赌、圖標(biāo)等信息均由子視圖自己控制除盏,UITabBarController僅僅作為一個(gè)容器存在
4.3 ios8新增的切換方法 showViewController
這個(gè)方法應(yīng)該說(shuō)是全能型界面切換的方法,它能根據(jù)當(dāng)前的試圖控制器情況來(lái)決定是用push方法還是普通的Modal方式切換界面挫以。在當(dāng)前界面是Navi的子VC時(shí)者蠕,如果用showViewController方法,它會(huì)用push方式切換(用pop方式可以返回)掐松;而如果當(dāng)前界面為Modal的界面,就會(huì)用modal方式蠢棱⌒可保可以這么說(shuō),如果沒(méi)有特別的要求需要modal界面泻仙,你只需要在界面切換時(shí)一股腦兒的用showViewController方法就行了糕再,ios的sdk后臺(tái)基本已經(jīng)處理好了你該怎么跳轉(zhuǎn)。另外補(bǔ)充一條玉转,在以前突想,導(dǎo)航控制器的子VC是不能push一個(gè)新的導(dǎo)航控制器的,否則運(yùn)行就會(huì)掛掉究抓,但是showVIewController可以做到猾担!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市刺下,隨后出現(xiàn)的幾起案子绑嘹,更是在濱河造成了極大的恐慌,老刑警劉巖橘茉,帶你破解...
    沈念sama閱讀 218,386評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件工腋,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡畅卓,警方通過(guò)查閱死者的電腦和手機(jī)擅腰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)翁潘,“玉大人趁冈,你說(shuō)我怎么就攤上這事“萋恚” “怎么了渗勘?”我有些...
    開封第一講書人閱讀 164,704評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)俩莽。 經(jīng)常有香客問(wèn)我旺坠,道長(zhǎng),這世上最難降的妖魔是什么豹绪? 我笑而不...
    開封第一講書人閱讀 58,702評(píng)論 1 294
  • 正文 為了忘掉前任价淌,我火速辦了婚禮,結(jié)果婚禮上瞒津,老公的妹妹穿的比我還像新娘蝉衣。我一直安慰自己,他們只是感情好巷蚪,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,716評(píng)論 6 392
  • 文/花漫 我一把揭開白布病毡。 她就那樣靜靜地躺著,像睡著了一般屁柏。 火紅的嫁衣襯著肌膚如雪啦膜。 梳的紋絲不亂的頭發(fā)上有送,一...
    開封第一講書人閱讀 51,573評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音僧家,去河邊找鬼雀摘。 笑死,一個(gè)胖子當(dāng)著我的面吹牛八拱,可吹牛的內(nèi)容都是我干的阵赠。 我是一名探鬼主播,決...
    沈念sama閱讀 40,314評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼肌稻,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼清蚀!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起爹谭,我...
    開封第一講書人閱讀 39,230評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤枷邪,失蹤者是張志新(化名)和其女友劉穎鲸沮,沒(méi)想到半個(gè)月后玖详,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,680評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡您朽,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,873評(píng)論 3 336
  • 正文 我和宋清朗相戀三年绑洛,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了救斑。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片童本。...
    茶點(diǎn)故事閱讀 39,991評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡真屯,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出穷娱,到底是詐尸還是另有隱情绑蔫,我是刑警寧澤,帶...
    沈念sama閱讀 35,706評(píng)論 5 346
  • 正文 年R本政府宣布泵额,位于F島的核電站配深,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏嫁盲。R本人自食惡果不足惜篓叶,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,329評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望羞秤。 院中可真熱鬧缸托,春花似錦、人聲如沸瘾蛋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)哺哼。三九已至佩抹,卻和暖如春叼风,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背棍苹。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工无宿, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人枢里。 一個(gè)月前我還...
    沈念sama閱讀 48,158評(píng)論 3 370
  • 正文 我出身青樓懈贺,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親坡垫。 傳聞我的和親對(duì)象是個(gè)殘疾皇子梭灿,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,941評(píng)論 2 355

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