###一、檢視切換
- UITabBarController (分頁控制器) - 平行管理檢視
- UINavigationController (導航控制器) - 壓棧出棧管理檢視
- 模態視窗
###二、UITabBarController分頁控制器
UITabBarController
是為了利用 頁籤切換檢視 設計的控制器- 該控制器有一個
UITabBar
控制元件,使用者通過點選UITabBar
進行檢視切換 UITabBarController
本身會不顯示任何檢視,它只是一個 容器控制器- 為了減少檢視間的耦合,所有
UITabBarController
的子檢視的相關標題、圖示等資訊由子檢視自己控制
UITabBarController
會一次性初始化所有子控制器,但預設只載入第一個控制器檢視- 每個檢視控制器都有一個
tabBarController
屬性,用它來訪問所在的UITabBarController
- 每個檢視控制器都有一個
tabBarItem
屬性,用它來控制UITabBarController
的UITabBar
上的顯示資訊tarBarItem
的image
屬性必須是png
格式,並且開啟alpha
通道 ,否則無法正常顯示
UITabBarController
通常是作為整個程式的rootViewController
的,我們需要在程式的window
顯示之前就建立好它。
######具體步驟如下:
- 建立一個
UITabBarController
物件- 建立
UITabBarController
中每一個tab對應的要顯示的物件viewController
- 通過
UITabBarController
的viewControllers
屬性將要顯示的所有viewController
新增到UITabBarController
中- 通過設定
UITabBarController
物件為window.rootViewController
,然後顯示window
//a.初始化一個tabBar控制器
UITabBarController *tarbarVC = [[UITabBarController alloc] init];
//設定控制器為Window的根控制器
self.window.rootViewController = tarbarVC;
//b.建立子控制器
UIViewController *c1 = [[UIViewController alloc] init];
c1.view.backgroundColor = [UIColor grayColor];
c1.view.backgroundColor=[UIColor greenColor];
c1.tabBarItem.title = @"訊息";
c1.tabBarItem.image = [UIImage imageNamed:@"tab_recent_nor"];
c1.tabBarItem.badgeValue = @"123";
UIViewController *c2 = [[UIViewController alloc] init];
c2.view.backgroundColor = [UIColor brownColor];
c2.tabBarItem.title = @"聯絡人";
c2.tabBarItem.image = [UIImage imageNamed:@"tab_buddy_nor"];
UIViewController *c3 = [[UIViewController alloc] init];
c3.tabBarItem.title = @"動態";
c3.tabBarItem.image = [UIImage imageNamed:@"tab_qworld_nor"];
UIViewController *c4 = [[UIViewController alloc] init];
c4.tabBarItem.title = @"設定";
c4.tabBarItem.image = [UIImage imageNamed:@"tab_me_nor"];
//c.新增子控制器到ITabBarController中
tarbarVC.viewControllers = @[c1,c2,c3,c4];
//d.設定Window為主視窗並顯示出來
[self.window makeKeyAndVisible];
複製程式碼
######UITabBarControllerDelegate代理
#pragma mark 該方法用於控制TabBarItem能不能選中
- (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController;
複製程式碼
######改變UITabBarController當前顯示檢視的方法
- 改變selectedIndex屬性
- 改變selectedViewController屬性
- 改變viewControllers屬性
###三、UINavigationController導航控制器
UINavigationController
中的子控制器以棧的形式儲存,只有在棧頂部的控制器才能顯示在介面上- 壓棧
pushController
,出棧popController
UINavigationController
必須有一個根控制器rootViewController
- 子控制器通過
navigationController
屬性訪問UINavigationController
- 在棧中的子控制器都有一個導航欄
navigationBar
,通過navigationItem
去控制
######UINavigationItem屬於MVC中的Model,封裝了要顯示在UINavigationBar上的資料:
title
: 標題titleView
:標題檢視leftBarButtonItem
:左按鈕rightBarButtonItem
:右按鈕######下一個子檢視左側返回按鈕
leftBarButtonItem
的標題優先順序:
- 導航欄返回按鈕
backBarButtonItem
的標題- 導航欄
navigationItem
的標題- 檢視控制器的標題
######UINavigationController常用的主要方法:
#pragma mark 壓棧,把控制器壓入導航控制器子控制器棧中
- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated;
#pragma mark 出棧,把導航控制器子控制器棧的棧頂彈出
- (void)popViewControllerAnimated:(BOOL)animated;
#pragma mark 多次出棧直到棧頂為指定控制器
- (void)popToViewController:(UIViewController *)viewController animated:(BOOL)animated;
#pragma mark 多次出棧直到棧頂為根控制器
- (void)popToRootViewControllerAnimated:(BOOL)animated;
複製程式碼
###四、模態視窗
#pragma mark 從下方彈出指定的檢視控制器,賦予模態,即當前檢視關閉前,其他檢視上的內容無法操作
- (void)presentViewController:(UIViewController *)viewControllerToPresent animated:(BOOL)flag completion:(void (^)(void))completion;
#pragma mark 關閉模態視窗,該方法在模態視窗中呼叫
- (void)dismissViewControllerAnimated:(BOOL)flag completion:(void (^)(void))completion;
複製程式碼