標籤:
多控制器之間的跳轉
1> 什麼是多控制器之間的跳轉?
在一個 APP 中,會存在多個控制器,多個控制器的存在就會存在控制器的跳轉問題.
2> 包含:連線跳轉,modal 方式以及navigationController/tabBarontroller方式
連線跳轉的分類:
> 自動型:點擊控制項後,自動跳轉到下一個控制器(action – push 方式)
> 手動型:需要藉助於代碼手動完成.
手動型,是指從來源控制器拖到目標控制器.(manual – push 方式),手動型需要設定 storyboard segue 中的identify 標記.手動型要調用一下方法:
[self performSegueWithIdentifier:ID sender:nil];
系統會調用:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
注:向下一個控制器順序傳遞資料可以在此方法中書寫.
- Modal 方式 該方式是系統預設的方式,它是從系統底部往上走,覆蓋原來的控制器.
使用步驟:
1 建立要跳轉到的控制器
2 跳轉和關閉
[self presentViewController:建立的控制器]
[self dismissViewControllerAnimated:YES]
3 子控制器是在 dismisss 後會銷毀
- Push 和 pop 方式,該方法用於 navigationController 的跳轉
使用步驟:
1 建立要跳轉到的控制器
注:使用該方式一定要注意設定根控制器.
2 跳轉和退出
[self.navigationController pushViewController:vc animated:YES];
3 使用 UINavigationController 的時候, UINavigationController會給所有的目標控制器套上導航條,完成 push 之後會自動在導航條上產生一個 item 返回按鈕,該按鈕可以直接返回到上一層的控制器.
注: 使用UINavigationController設定導覽列的時候只需要設定一次,之後派生的導覽列都和根控制器的導覽列一樣.該導覽列的設定是在 initialize 方法中的設定外觀代理對象來完成的
注: UITabBarController要把所有要跳轉的控制器一次性載入完成,它的子控制器的同時存在的,並不會因為跳轉到其他子控制器而銷毀.載入子控制器的時候有兩種方式: addChildViewController:VC(載入一個子控制器). viewControllers(載入多個子控制器)其傳回值是一個數組,可以將控制器直接載入到數組中並且要注意載入到數組中的順序就是載入到 tabBar 中的顯示的順序.
3> 不同跳轉方式的區別
1 push—pop 需要在 navigationController 中使用.方式是以棧的方式進行控制器的跳轉,進棧的時候將新進來的控制器放在棧頂.是以側滑的方式進入控制器
-(void)pushViewController: (UIViewController *)
viewController animated: (BOOL)animated;
> 退出的時候可以有三種方式
> 控制器進入的時候是以進棧的方式進入的,即新進入的控制器從右側進入,將之前的控制器推到左側,退出的時候將棧頂控制器直接移除.(注 tabbarController 中並不移除控制器,只是來回的切換.)
>移除棧頂控制器: - (UIViewController *)popViewControllerAnimated 方法
>回到指定的子控制器: -(NSArray *)popViewController 方法
> 回到根控制器
-(NSArray *)popToRootViewController 方法
2 modal 方式:
任何控制器都可以通過 modal 方式來進行跳轉,是一個通用性的跳轉方式,其預設效果是從下往上走,直到完全覆蓋上面的控制器.被覆蓋的控制器並沒有銷毀.
3 以 push 方式載入的控制器會在子控制器上加上一個返回按鈕,但 modal 方式不會自動添加,返回按鈕要自己建立.
4 modal 出來的控制器將原來的控制器完全覆蓋,原來的控制器不可點擊. 而由於Push 控制器只是在navigationController 中 push 控制器.
4> 補充
4.1為了便於管理控制器,iOS提供了2個比較特殊的控制器
UINavigationControlle UITabBarController.
4.1.2使用的時候一般用UITabBarController控制器作為視窗的根控制器,然後將UINavigationControlle 做為UITabBarController的根控制器,再載入所需控制器.
4.1.3設定視窗的根控制器步驟
一般通常在Appdelegate裡面設定裡
> 初始化一個視窗
> 設定視窗的根控制器為導航控制器
> 初始化導航控制器的時候一般要跟一個的控制器.
4.1.4 UINavigationControlle 的特點
> 棧中添加控制器,使用push操作,刪除控制器使用pop操作.
> 最先添加的控制器在棧底,而後添加的控制器則在上面,直接使用pop操作,是讓棧頂的控制器銷毀了,可以指定pop的控制器.但是要注意控制器的循環參考.
> push/pop 的方式是UINavigationControlle 專屬的方式,只有UINavigationControlle 和其子類才能夠使用該方式.
> pop 控制器的時候可以有popViewController(返回到上一個控制器), popToViewController(返回到指定的控制器), popToRootViewController(返回到根控制器)三種.注:要擷取指定的控制器用遍曆的方式(XXX isKindOfXXX)
4.2 UITabBarController
4.2.1內部實現原理:以平行的方式管理檢視,各個視圖之間往往關係並不大,每個加入到UITabBarController的視圖都會進行初始化即使當前不顯示在介面上,相對比較佔用記憶體。通過給標籤控制器的子控制器集合內添加控制器,通過選中的(點擊操作)的索引進行控制器的切換.標籤控制器內部也是擁有一個子控制器的集合的.
4.2.2 實現原理: UITabBarController是Apple專門為了利用頁簽切換視圖而設計的,在這個視圖控制器中有一個UITabBar控制項,使用者通過點擊tabBar進行視圖切換。我們知道在UIViewController內部有一個視圖,一旦建立了UIViewController之後預設就會顯示這個視圖,但是UITabBarController本身並不會顯示任何視圖,如果要顯示視圖則必須設定其viewControllers屬性(它預設顯示viewControllers[0])。這個屬性是一個數組,它維護了所有UITabBarController的子視圖。為了儘可能減少視圖之間的耦合,所有的UITabBarController的子視圖的相關標題、表徵圖等資訊均由子視圖自己控制,UITabBarController僅僅作為一個容器存在
4.3 ios8新增的切換方法 showViewController
這個方法應該說是全能型介面切換的方法,它能根據當前的試圖控制器情況來決定是用push方法還是普通的Modal方式切換介面。在當前介面是Navi的子VC時,如果用showViewController方法,它會用push方式切換(用pop方式可以返回);而如果當前介面為Modal的介面,就會用modal方式。可以這麼說,如果沒有特別的要求需要modal介面,你只需要在介面切換時一股腦兒的用showViewController方法就行了,ios的sdk後台基本已經處理好了你該怎麼跳轉。另外補充一條,在以前,導航控制器的子VC是不能push一個新的導航控制器的,否則運行就會掛掉,但是showVIewController可以做到!
多控制器之間的跳轉