界面跳轉

之前一直有個很疑惑的問題沒有搞清楚 ios

關於ios中 viewcontroller的跳轉問題,其中有一種方式是採用navigationController pushViewController 的方法,好比我從主頁面跳轉到了一級頁面,又從一級頁面跳轉到了二級頁面,而後從二級頁面跳轉到了三級頁面,依次類推。,若是一級一級的返回我知道是沒有問題的,調用navigationController popViewControllerAnimated就好了。。可是某些狀況下我可能想要立刻回到主頁面,而不是一級一級的返回(若是有不少層會很累的),那該怎麼辦呢?數組

返回根頁面vc用 :app

?ide

1
[self.navigationController popToRootViewController]

返回指定的某個vc用下面(經過index定位) spa

?.net

1
[self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:2] animated:YES];

或(經過class定位)code

?orm

1
2
3
4
5
for (UIViewController *controller in self.navigationController.viewControllers) {
     if ([controller isKindOfClass:[你要跳轉到的Controller class ]]) {
         [self.navigationController popToViewController:controller animated:YES];
     }
}



1、最普通的視圖控制器UIViewContoller對象

  一個普通的視圖控制器通常只有模態跳轉的功能(ipad我不瞭解除外,這裏只說iPhone),這個方法是全部視圖控制器對象均可以用的,而實現這種功能,有兩種方法。blog

  一、經過方法 - (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過來的。

 

  二、經過方法 - (void)performSegueWithIdentifier:(NSString *)identifier sender:(id)sender跳轉

    若是代碼要用這種方式,首先要建立一個UIStoryboardSegue對象,並給初始化相應的值。UIStoryboardSegue類有哪些方法和屬性,去看看官方文檔就明白了,我這裏就很少說了。

    UIStoryboardSegue對象,提供了 跳轉源界面,跳轉目的界面,以及一個identifier也就是上面的identifier了,相信這麼一說你們就知道這個類是幹嗎的了。

    不過我沒用代碼這麼寫過,通常用這種方法跳轉,我都是在storyboard裏面直接根據所給的identifier來寫的,也就是咱們在storyboard中不一樣界面間拉的線(也就是UIStoryboardSegue)的屬性中寫的。

    這種方法同時也支持UINavigationController的跳轉,不過跳轉的模式爲push了,它只能在當前視圖控制器是UINavigationController時才能用。

 

  上述兩種方式,都是經過 dismissViewControllerAnimated 來返回前一個界面的。

 

 

 

2、導航控制器UINavigationController

  一、pushViewController    推出某個視圖控制器

  須要注意的是,這個方法,是UINavigationController和其子類纔有的方法,普通的控制器是沒有的。 因此用得時候通常是某個aNavigationController pushViewcontroller或者self.navigationController pushViewController。

  2.經過上面所述的performSegueWithIdentifier方法跳轉,就很少說了。

    

  因爲UINavigationController是一個視圖控制器的容器,他裏面可能放了不少個控制器,因此返回的時候能夠分爲幾種狀況。

  A:彈出當前顯示的界面,也就是返回到上個界面, popViewController(注意,噹噹前界面是根結面時,這個方法是不起做用的)。

  B:返回到控制器的根結面,popToRootViewController。

  C:跳轉到這個視圖控制器的中間的某個界面。popToViewController。用這種方式,就須要知道跳轉到哪一個界面了,獲取須要跳轉的界面的方式有不少,我通常是遍歷UINavigationController的viewControllers數組,用iskindofclass方法來獲取某個控制器對象再來跳轉的。

 

 

3、UITabBarController

  tabbar控制器,相信你們也用的不少,通常做爲app的根界面視圖控制器。其實與其說UITabBarController的界面跳轉,不如說是界面切換,由於UITabBarController的界面跳轉其實就是UITabBarController的viewControllers數組中的幾個界面切換。只要設置好了UITabBarController的viewControllers數組,切面的切換基本就沒咱們什麼事兒了。

 

4、補充一點 :經過子界面實現同個控制器下的界面切換。

  咱們開發中,可能會遇到某個界面比較複雜,要進行多個界面的切換,若是把這些界面切換全都放在該界面中,控制器代碼很是臃腫不說,控制起來也比較麻煩,這個時候我建議用不一樣的控制器來表示不一樣的界面,而後將這些界面經過addChildViewController添加到控制器的子控制器中,而後經過系統提供的方法進行切換,至於這種方法怎麼用,你們看下官方文檔就知道了。

  這種方法一般會和UISegmentController配合使用。

相關文章
相關標籤/搜索