一、最普通的視圖控制器UIViewContoller
一個普通的視圖控制器一般只有模態跳轉的功能(ipad我不了解除外,這里只說iPhone),這個方法是所有視圖控制器對象都可以用的,而實現這種功能,有兩種方法。
1、通過方法 - (void)presentViewController:(UIViewController *)viewControllerToPresent animated: (BOOL)flag completion:(void (^)(void))completion跳轉
相信很多人都用過這個方法,他是所有視圖控制器對象都有的成員方法。基本絕大部分情況下,這個成員方法都可以正常使用,不過有些時候可能會使用失敗,失敗一般的原因都是,同一個視圖控制器,在同一個時間,只能present一個另外的視圖控制器,如果當前的VC已經present了,再次present一個VC時,就會提示失敗,具體的失敗提示在log里面有,我忘了就不說了,如果想繼續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;
這兩個屬性,在有些時候,用起來是很方便的。比如說,現在有個C界面,C界面被顯示出來,可能有兩種情況,一是modal出來的,另外一種是push出來的,這時候就可以通過當前界面對象的presentingViewController屬性來判斷到底屬於哪種情況,如果是nil,表示是UINavigationController對象push過來的,如果不是則是modal過來的。
2、通過方法 - (void)performSegueWithIdentifier:(NSString *)identifier sender:(id)sender跳轉
如果代碼要用這種方式,首先要創建一個UIStoryboardSegue對象,並給初始化相應的值。UIStoryboardSegue類有哪些方法和屬性,去看看官方文檔就明白了,我這里就不多說了。
UIStoryboardSegue對象,提供了 跳轉源界面,跳轉目的界面,以及一個identifier也就是上面的identifier了,相信這么一說大家就知道這個類是干嘛的了。
不過我沒用代碼這么寫過,一般用這種方法跳轉,我都是在storyboard里面直接根據所給的identifier來寫的,也就是我們在storyboard中不同界面間拉的線(也就是UIStoryboardSegue)的屬性中寫的。
上述兩種方式,都是通過 dismissViewControllerAnimated 來返回前一個界面的。
二、導航控制器UINavigationController
1、pushViewController 推出某個視圖控制器
需要注意的是,這個方法,是UINavigationController和其子類才有的方法,普通的控制器是沒有的。 所以用得時候一般是某個aNavigationController pushViewcontroller或者self.navigationController pushViewController。
2.通過上面所述的performSegueWithIdentifier方法跳轉,就不多說了。
由於UINavigationController是一個視圖控制器的容器,他里面可能放了很多個控制器,所以返回的時候可以分為幾種情況。
A:彈出當前顯示的界面,也就是返回到上個界面, popViewController(注意,當當前界面是根結面時,這個方法是不起作用的)。
B:返回到控制器的根結面,popToRootViewController。
C:跳轉到這個視圖控制器的中間的某個界面。popToViewController。用這種方式,就需要知道跳轉到哪個界面了,獲取需要跳轉的界面的方式有很多,我一般是遍歷UINavigationController的viewControllers數組,用iskindofclass方法來獲取某個控制器對象再來跳轉的。
三、UITabBarController
tabbar控制器,相信大家也用的很多,一般作為app的根界面視圖控制器。其實與其說UITabBarController的界面跳轉,不如說是界面切換,因為UITabBarController的界面跳轉其實就是UITabBarController的viewControllers數組中的幾個界面切換。只要設置好了UITabBarController的viewControllers數組,tabbar控制器的切換界面基本就沒我們什么事兒了。
四、補充一點 :通過子界面實現同個控制器下的子視圖的切換。
我們開發中,可能會遇到某個界面比較復雜,要進行多個子視圖(UIView)的切換,如果把這些界面切換全都放在該界面中,控制器代碼非常臃腫不說,控制起來也比較麻煩,這個時候我建議用不同的控制器來表示不同的子視圖,將這些界面通過addChildViewController添加到控制器的子控制器數組中,然后通過transitionFromViewController方法進行切換
交換兩個子視圖控制器的位置(由於添加的順序不同,所以子試圖控制器在父視圖控制器中存在層次關系)
fromViewController:當前顯示的子試圖控制器,將被替換為非顯示狀態
toViewController:將要顯示的子視圖控制器
duration:交換動畫持續的時間,單位秒
options:動畫的方式
animations:動畫Block
completion:完成后執行的Block
這種方法通常會和UISegmentController控件配合使用。
此為切換視圖時代碼運行順序:
2016-04-19 13:28:07.511 子視圖控制器的切換[941:83892] FirstViewController viewDidLoad
2016-04-19 13:28:07.512 子視圖控制器的切換[941:83892] FirstViewController viewWillAppear
2016-04-19 13:28:07.517 子視圖控制器的切換[941:83892] FirstViewController viewDidAppear
2016-04-19 13:28:19.356 子視圖控制器的切換[941:83892] SecondViewController viewDidLoad
2016-04-19 13:28:19.357 子視圖控制器的切換[941:83892] FirstViewController viewWillDisappear
2016-04-19 13:28:19.357 子視圖控制器的切換[941:83892] SecondViewController viewWillAppear
2016-04-19 13:28:19.359 子視圖控制器的切換[941:83892] SecondViewController viewDidAppear
2016-04-19 13:28:19.359 子視圖控制器的切換[941:83892] FirstViewController viewDidDisappear
五、ios8新增的切換方法 showViewController
這個方法我只在這里補充簡單說明一下,我也是不久之前才研究這個方法。這個方法應該說是全能型界面切換的方法,它能根據當前的試圖控制器情況來決定是用naviVC的push方法還是普通VC的Modal方式切換界面。在當前界面是Navi的子VC時,如果用showViewController方法,它會用push方式切換(用pop方式可以返回);而如果當前界面為Modal的界面,也就是不是navi的子VC,就會用modal方式。可以這么說,如果沒有特別的要求需要modal界面,你只需要在界面切換時一股腦兒的用showViewController方法就行了,ios的sdk后台基本已經處理好了你該怎么跳轉。另外補充一條,在以前,naviVC的子VC是不能push一個新的naviVC的,否則運行就會掛掉,但是showVIewController可以做到!
參考:http://www.cnblogs.com/iMiamas/p/4282568.html
