關(guān)于控制器之間的跳轉(zhuǎn)問題

之前一直有些疑惑康二,到底控制器的不同的展示形式有什么區(qū)別漠趁,今天就查了一些資料逞刷,做了一個小結(jié)省店。


在一個app中夕土,會存在多個控制器尝艘,多個控制器的存在就會存在控制器的跳轉(zhuǎn)問題物咳。

跳轉(zhuǎn)的形式包涵:?

1.連線跳轉(zhuǎn)(根據(jù)綁定的id進(jìn)行控制器的跳轉(zhuǎn))

2.modal方式

3.navigationController/tabBarController方式


連線跳轉(zhuǎn)的分類:

1.自動型:點擊控件后邻储,自動跳轉(zhuǎn)到一下個控制器(action-push方式)

2.手動型:需要借助代碼來手動完成



手動型,是指從來源控制器拖到目標(biāo)控制器.(manual – push 方式),手動型需要設(shè)置 storyboard segue 中的identify 標(biāo)記.手動型要調(diào)用一下方法:

[self performSegueWithIdentifier:ID sender:nil];

系統(tǒng)會調(diào)用:

-? (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender

注:向下一個控制器順序傳遞數(shù)據(jù)可以在此方法中書寫.


Modal方式幔睬,該方式是系統(tǒng)默認(rèn)的方式眯漩,它是從系統(tǒng)底部往上走,覆蓋原來的控制器麻顶。

使用步驟:

1.創(chuàng)建要跳轉(zhuǎn)到的控制器

2.跳轉(zhuǎn)和關(guān)閉

[self presentViewController:創(chuàng)建的控制器];

[self ? dismissViewController:YES];

3.子控制器是在dismiss之后才會銷毀掉

push和pop方式赦抖,該方法用于navigationController的跳轉(zhuǎn).


使用步驟:

1.創(chuàng)建要跳轉(zhuǎn)的控制器(一定要先設(shè)置根控制器)

2.跳轉(zhuǎn)和退出

[self.navigationController ?pushViewController:vc ?animated:YES];

3.使用UINavigationController的時候,UINavigationController會給所有的目標(biāo)控制器套上導(dǎo)航條澈蚌,完成push之后會自動在導(dǎo)航條上生成一個item返回按鈕摹芙,該按鈕可以直接返回上一層的控制器。

(注: 使用UINavigationController設(shè)置導(dǎo)航欄的時候只需要設(shè)置一次,之后派生的導(dǎo)航欄都和根控制器的導(dǎo)航欄一樣.該導(dǎo)航欄的設(shè)置是在 initialize 方法中的設(shè)置外觀代理對象來完成的)


注: UITabBarController要把所有要跳轉(zhuǎn)的控制器一次性加載完成,它的子控制器的同時存在的,并不會因為跳轉(zhuǎn)到其他子控制器而銷毀.加載子控制器的時候有兩種方式: addChildViewController:VC(加載一個子控制器). viewControllers(加載多個子控制器)其返回值是一個數(shù)組,可以將控制器直接加載到數(shù)組中并且要注意加載到數(shù)組中的順序就是加載到 tabBar 中的顯示的順序.


不同跳轉(zhuǎn)方式的區(qū)別:

1.push-pop需要在navigationController中使用宛瞄,方式是以棧的方式進(jìn)行控制器的跳轉(zhuǎn)浮禾,進(jìn)棧的時候?qū)⑿逻M(jìn)來的控制器放在棧頂,是以側(cè)滑的方式進(jìn)入控制器

- (void)pushViewController:(UIViewController ?*)viewController ?animated:(BOOL)animated;

退出的時候可以有三種方式:

控制器進(jìn)入的時候是以棧的形式進(jìn)入的份汗,即新進(jìn)入的控制器是從右側(cè)進(jìn)入盈电,將之前的控制器推到左側(cè),退出的時候?qū)m斂刂破髦苯右瞥睢#ㄗabBarController中并不移除控制器匆帚,只是來回的切換)

移除棧頂控制器:

- (UIViewController ? *)popViewController;

回到制定的子控制器:

- (NSArray *)popViewController;

回到根控制器

- (NSArray ?*)popToRootViewController;?


2 modal 方式:

任何控制器都可以通過 modal 方式來進(jìn)行跳轉(zhuǎn),是一個通用性的跳轉(zhuǎn)方式,其默認(rèn)效果是從下往上走,直到完全覆蓋上面的控制器.被覆蓋的控制器并沒有銷毀.

3 以 push 方式加載的控制器會在子控制器上加上一個返回按鈕,但 modal 方式不會自動添加,返回按鈕要自己創(chuàng)建.

4 modal 出來的控制器將原來的控制器完全覆蓋,原來的控制器不可點擊. 而由于Push 控制器只是在navigationController 中 push 控制器.


4> 補(bǔ)充

4.1為了便于管理控制器,iOS提供了2個比較特殊的控制器

UINavigationControlle? UITabBarController.

4.1.2使用的時候一般用UITabBarController控制器作為窗口的根控制器,然后將UINavigationControlle 做為UITabBarController的根控制器,再加載所需控制器.

4.1.3設(shè)置窗口的根控制器步驟

一般通常在Appdelegate里面設(shè)置里

> 初始化一個窗口

> 設(shè)置窗口的根控制器為導(dǎo)航控制器

> 初始化導(dǎo)航控制器的時候一般要跟一個的控制器.

4.1.4 UINavigationControlle 的特點

> 棧中添加控制器,使用push操作,刪除控制器使用pop操作.

> 最先添加的控制器在棧底,而后添加的控制器則在上面,直接使用pop操作,是讓棧頂?shù)目刂破麂N毀了,可以指定pop的控制器.但是要注意控制器的循環(huán)引用.

> push/pop 的方式是UINavigationControlle 獨有的方式,只有UINavigationControlle 和其子類才能夠使用該方式.

> pop 控制器的時候可以有popViewController(返回到上一個控制器), popToViewController(返回到指定的控制器), popToRootViewController(返回到根控制器)三種.注:要獲取指定的控制器用遍歷的方式(XXX isKindOfXXX)

4.2 UITabBarController

4.2.1內(nèi)部實現(xiàn)原理:以平行的方式管理視圖旁钧,各個視圖之間往往關(guān)系并不大吸重,每個加入到UITabBarController的視圖都會進(jìn)行初始化即使當(dāng)前不顯示在界面上互拾,相對比較占用內(nèi)存。通過給標(biāo)簽控制器的子控制器集合內(nèi)添加控制器,通過選中的(點擊操作)的索引進(jìn)行控制器的切換.標(biāo)簽控制器內(nèi)部也是擁有一個子控制器的集合的.

4.2.2 實現(xiàn)原理: UITabBarController是Apple專門為了利用頁簽切換視圖而設(shè)計的嚎幸,在這個視圖控制器中有一個UITabBar控件颜矿,用戶通過點擊tabBar進(jìn)行視圖切換。我們知道在UIViewController內(nèi)部有一個視圖嫉晶,一旦創(chuàng)建了UIViewController之后默認(rèn)就會顯示這個視圖骑疆,但是UITabBarController本身并不會顯示任何視圖,如果要顯示視圖則必須設(shè)置其viewControllers屬性(它默認(rèn)顯示viewControllers[0])替废。這個屬性是一個數(shù)組箍铭,它維護(hù)了所有UITabBarController的子視圖。為了盡可能減少視圖之間的耦合椎镣,所有的UITabBarController的子視圖的相關(guān)標(biāo)題诈火、圖標(biāo)等信息均由子視圖自己控制,UITabBarController僅僅作為一個容器存在

4.3 ios8新增的切換方法 showViewController

這個方法應(yīng)該說是全能型界面切換的方法衣陶,它能根據(jù)當(dāng)前的試圖控制器情況來決定是用push方法還是普通的Modal方式切換界面柄瑰。在當(dāng)前界面是Navi的子VC時闸氮,如果用showViewController方法剪况,它會用push方式切換(用pop方式可以返回);而如果當(dāng)前界面為Modal的界面,就會用modal方式蒲跨∫攵希可以這么說,如果沒有特別的要求需要modal界面或悲,你只需要在界面切換時一股腦兒的用showViewController方法就行了孙咪,ios的sdk后臺基本已經(jīng)處理好了你該怎么跳轉(zhuǎn)。另外補(bǔ)充一條巡语,在以前翎蹈,導(dǎo)航控制器的子VC是不能push一個新的導(dǎo)航控制器的,否則運行就會掛掉男公,但是showVIewController可以做到荤堪!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市枢赔,隨后出現(xiàn)的幾起案子澄阳,更是在濱河造成了極大的恐慌,老刑警劉巖踏拜,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件碎赢,死亡現(xiàn)場離奇詭異,居然都是意外死亡速梗,警方通過查閱死者的電腦和手機(jī)肮塞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進(jìn)店門襟齿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人枕赵,你說我怎么就攤上這事蕊唐。” “怎么了烁设?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵替梨,是天一觀的道長。 經(jīng)常有香客問我装黑,道長副瀑,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任恋谭,我火速辦了婚禮糠睡,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘疚颊。我一直安慰自己狈孔,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布材义。 她就那樣靜靜地躺著均抽,像睡著了一般。 火紅的嫁衣襯著肌膚如雪其掂。 梳的紋絲不亂的頭發(fā)上油挥,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天,我揣著相機(jī)與錄音款熬,去河邊找鬼深寥。 笑死,一個胖子當(dāng)著我的面吹牛贤牛,可吹牛的內(nèi)容都是我干的惋鹅。 我是一名探鬼主播,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼殉簸,長吁一口氣:“原來是場噩夢啊……” “哼闰集!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起喂链,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤返十,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后椭微,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體洞坑,經(jīng)...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年蝇率,在試婚紗的時候發(fā)現(xiàn)自己被綠了迟杂。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片刽沾。...
    茶點故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖排拷,靈堂內(nèi)的尸體忽然破棺而出侧漓,到底是詐尸還是另有隱情,我是刑警寧澤监氢,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布布蔗,位于F島的核電站,受9級特大地震影響浪腐,放射性物質(zhì)發(fā)生泄漏纵揍。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一议街、第九天 我趴在偏房一處隱蔽的房頂上張望泽谨。 院中可真熱鬧,春花似錦特漩、人聲如沸吧雹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽雄卷。三九已至,卻和暖如春访得,著一層夾襖步出監(jiān)牢的瞬間龙亲,已是汗流浹背陕凹。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工悍抑, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人杜耙。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓搜骡,卻偏偏與公主長得像,于是被迫代替她去往敵國和親佑女。 傳聞我的和親對象是個殘疾皇子记靡,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,472評論 2 348

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