UINavigationController通過棧的方式管理控制器的切換,控制入棧和出棧來展示各個視圖控制器。
UINavigationController的ContentView里始終顯示棧頂控制的View缤弦。
Viewcontroller屬性是一個可變數(shù)組(NSMutableArray)存儲了棧中的所有被管理的控制器敌土,入棧的時候,使用addObject把新的視圖控制器對象添加到數(shù)組末尾闻妓,出棧的時候removeLastObject移除數(shù)組末尾的視圖控制器對象。
navigationController屬性掠械,父類的屬性由缆,每個在棧中的控制器,都能通過此屬性猾蒂,獲取自己所在的UINavigationController對象均唉。
棧的特點:先進后出,后進先出肚菠。
棧頂為當前顯示的視圖控制器舔箭。
具體參考文章 棧:http://book.2cto.com/201209/3976.html
UINavigationController常用屬性
viewControllers 所有處于棧中的控制器,使用數(shù)組保存
topViewController 位于棧頂?shù)目刂破?br>
visibleViewController 當前顯示的控制器 等同于topViewController 模態(tài)控制器原理
navigationBar 導(dǎo)航欄
navigationItem 導(dǎo)航欄控件
界面鍵跳轉(zhuǎn)兩種方式:模態(tài)和推出
模態(tài)(present)用于單獨功能界面的跳轉(zhuǎn)和主要業(yè)務(wù)邏輯沒有關(guān)聯(lián)(登錄蚊逢,歌曲播放頁层扶,系統(tǒng)相冊,應(yīng)用中調(diào)用系統(tǒng)功能)时捌。
*1怒医、通過方法- (void)presentViewController:(UIViewController )viewControllerToPresent animated: (BOOL)flag completion:(void (^)(void))completion跳轉(zhuǎn)
同一個視圖控制器,在同一個時間奢讨,只能present一個另外的視圖控制器稚叹,如果當前的VC已經(jīng)present了焰薄,再次present一個VC時,就會提示失敗扒袖,具體的失敗提示在log里面有,如果想繼續(xù)present塞茅,就必須將原來present的控制器dismiss。
說到這里季率,再延伸下控制器的兩個可能很多人都沒注意的兩個只讀屬性:presentedViewController和presentingViewController野瘦,他們分別是被present的控制器和正在presenting的控制器。比如說飒泻, 控制器A和B鞭光,[A presentViewController B animated:YES completion:nil]; 那么A相對于B就是presentingViewController,B相對于A是presentedViewController泞遗,即這個時候
B.presentingViewController = A;
A.presentedViewController = B;
這兩個屬性惰许,在有些時候,用起來是很方便的史辙。比如說汹买,現(xiàn)在有個C界面,C界面被顯示出來聊倔,可能有兩種情況晦毙,一是modal出來的,另外一種是push出來的耙蔑,這時候就可以通過當前界面對象的presentingViewController屬性來判斷到底屬于哪種情況见妒,如果是nil,表示是UINavigationController對象push過來的纵潦,如果不是則是modal過來的徐鹤。
*2、通過方法 - (void)performSegueWithIdentifier:(NSString )identifier sender:(id)sender跳轉(zhuǎn)
如果代碼要用這種方式邀层,首先要創(chuàng)建一個UIStoryboardSegue對象,并給初始化相應(yīng)的值遂庄。UIStoryboardSegue類有哪些方法和屬性寥院,去看看官方文檔就明白了,我這里就不多說了涛目。
UIStoryboardSegue對象秸谢,提供了 跳轉(zhuǎn)源界面,跳轉(zhuǎn)目的界面霹肝,以及一個identifier也就是上面的identifier了估蹄,相信這么一說大家就知道這個類是干嘛的了。
不過我沒用代碼這么寫過沫换,一般用這種方法跳轉(zhuǎn)臭蚁,我都是在storyboard里面直接根據(jù)所給的identifier來寫的,也就是我們在storyboard中不同界面間拉的線(也就是UIStoryboardSegue)的屬性中寫的。
這種方法同時也支持UINavigationController的跳轉(zhuǎn)垮兑,不過跳轉(zhuǎn)的模式為push了冷尉,它只能在當前視圖控制器是UINavigationController時才能用。
上述兩種方式系枪,都是通過 dismissViewControllerAnimated 來返回前一個界面的雀哨。
推出(push)用于一系列的視圖之間的跳轉(zhuǎn)又層次遞進關(guān)系。
1私爷、pushViewController 推出某個視圖控制器
需要注意的是雾棺,這個方法,是UINavigationController和其子類才有的方法衬浑,普通的控制器是沒有的捌浩。 所以用得時候一般是某個aNavigationController pushViewcontroller或者self.navigationController pushViewController。
四種setModalTransitionStyle風(fēng)格
UIModalTransitionStyleCoverVertical 從底部滑入
UIModalTransitionStyleFlipHorizontal,水平翻轉(zhuǎn)進入
UIModalTransitionStyleCrossDissolve,
交叉溶解UIModalTransitionStylePartialCurl,翻頁
場景切換
多個場景之間切換的樣式(Style)總共有5個:
Modal(模態(tài)) -- 過渡到另一個場景嚎卫,以完成一項任務(wù)嘉栓。任務(wù)完成后,將關(guān)閉該場景拓诸,并返回到原來的場景侵佃。Push(壓入) -- 創(chuàng)建一個場景鏈,用戶可在其中前后移動奠支。用于導(dǎo)航視圖控制器馋辈。
Replace(替換,僅適用于iPad) -- 替換當前場景倍谜,用于一些iPad特有的視圖控制器迈螟。
Popover(彈出框,僅適用于iPad) -- 一個帶箭頭的彈出框尔崔。
Custome(自定義) -- 通過編譯在場景之間進行自定義過渡答毫。
過渡類型(Transition)是從一個場景切換到另一個場景時播放的動畫。有4個選項:
Cover Vertical -- 新場景從下向上移動季春,逐漸覆蓋舊場景洗搂。
Flip Horizontal -- 視圖水平翻轉(zhuǎn),以顯示背面的新場景载弄。
Cross Dissolve -- 舊場景淡出耘拇,新場景淡入。
Partial Curl -- 舊場景像書頁一樣翻開宇攻,顯示下面的新場景惫叛。
在iPad應(yīng)用程序中,還會多出一個Presentation屬性逞刷,它決定了模態(tài)視圖在屏幕上的顯示方式嘉涌。有4種顯示樣式:
Form Sheet(表單) -- 將場景調(diào)整到比屏幕小(不管朝向)妻熊,并在當前場景后面顯示原始場景,這幾乎相當于在一個iPad窗口中顯示洛心。
Page Sheet(頁面) -- 調(diào)整場景大小固耘,使其以縱向格式顯示。
Full Screen(全屏) -- 調(diào)整場景大小词身,使其覆蓋整個屏幕厅目。
Current Context(當前上下文) -- 以原始場景的顯示方式展示場景。
返回
返回上一頁:
self.navigationController popViewControllerAnimated:YES
//返回指定的VC
self.navigationController popToViewController:self.navigationController.viewControllers[0] animated:YES
//返回根視圖
self.navigationController popToRootViewControllerAnimated:YES
2.通過上面所述的performSegueWithIdentifier方法跳轉(zhuǎn)法严,就不多說了损敷。
由于UINavigationController是一個視圖控制器的容器,他里面可能放了很多個控制器深啤,所以返回的時候可以分為幾種情況拗馒。
A:彈出當前顯示的界面,也就是返回到上個界面溯街, popViewController(注意诱桂,當當前界面是根結(jié)面時雷则,這個方法是不起作用的)七蜘。
B:返回到控制器的根結(jié)面,popToRootViewController抛腕。
C:跳轉(zhuǎn)到這個視圖控制器的中間的某個界面堤尾。popToViewController肝劲。用這種方式,就需要知道跳轉(zhuǎn)到哪個界面了郭宝,獲取需要跳轉(zhuǎn)的界面的方式有很多辞槐,我一般是遍歷UINavigationController的viewControllers數(shù)組,用iskindofclass方法來獲取某個控制器對象再來跳轉(zhuǎn)的粘室。
另外榄檬,UITabBarController,一般作為app的根界面視圖控制器衔统。其實與其說UITabBarController的界面跳轉(zhuǎn)丙号,不如說是界面切換,因為UITabBarController的界面跳轉(zhuǎn)其實就是UITabBarController的viewControllers數(shù)組中的幾個界面切換缰冤。只要設(shè)置好了UITabBarController的viewControllers數(shù)組,切面的切換基本就沒我們什么事兒了喳魏。
參考文章: IOS 瘋狂基礎(chǔ)之 頁面間跳轉(zhuǎn) http://blog.csdn.net/wudizhukk/article/details/8622389
iOS之淺談純代碼控制UIViewController視圖控制器跳轉(zhuǎn)界面的幾種方法 http://www.mamicode.com/info-detail-469709.html