iOS開發(fā)之視圖切換
一、視圖切換
- UITabBarController (分頁控制器) - 平行管理視圖
- UINavigationController (導(dǎo)航控制器) - 壓棧出棧管理視圖
- 模態(tài)窗口
二、UITabBarController分頁控制器
- UITabBarController是為了利用 頁簽切換視圖 設(shè)計(jì)的控制器
- 該控制器有一個UITabBar控件,用戶通過點(diǎn)擊UITabBar進(jìn)行視圖切換
- UITabBarController本身會不顯示任何視圖,它只是一個 容器控制器
- 為了減少視圖間的耦合,所有UITabBarController的子視圖的相關(guān)標(biāo)題、圖標(biāo)等信息由子視圖自己控制

注意事項(xiàng):
- UITabBarController會一次性初始化所有子控制器,但默認(rèn)只加載第一個控制器視圖
- 每個視圖控制器都有一個tabBarController屬性,用它來訪問所在的UITabBarController
- 每個視圖控制器都有一個tabBarItem屬性,用它來控制UITabBarController的UITabBar上的顯示信息
- tarBarItem的image屬性必須是png格式,并且打開alpha通道 ,否則無法正常顯示
- UITabBarController通常是作為整個程序的rootViewController的,我們需要在程序的window顯示之前就創(chuàng)建好它。
具體步驟如下:
- 創(chuàng)建一個UITabBarController對象
- 創(chuàng)建UITabBarController中每一個tab對應(yīng)的要顯示的對象viewController
- 通過UITabBarController的viewControllers屬性將要顯示的所有viewController添加到UITabBarController中
- 通過設(shè)置UITabBarController對象為window.rootViewController,然后顯示window
//a.初始化一個tabBar控制器
UITabBarController *tarbarVC = [[UITabBarController alloc] init];
//設(shè)置控制器為Window的根控制器
self.window.rootViewController = tarbarVC;
//b.創(chuàng)建子控制器
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 = @"聯(lián)系人";
c2.tabBarItem.image = [UIImage imageNamed:@"tab_buddy_nor"];
UIViewController *c3 = [[UIViewController alloc] init];
c3.tabBarItem.title = @"動態(tài)";
c3.tabBarItem.image = [UIImage imageNamed:@"tab_qworld_nor"];
UIViewController *c4 = [[UIViewController alloc] init];
c4.tabBarItem.title = @"設(shè)置";
c4.tabBarItem.image = [UIImage imageNamed:@"tab_me_nor"];
//c.添加子控制器到ITabBarController中
tarbarVC.viewControllers = @[c1,c2,c3,c4];
//d.設(shè)置Window為主窗口并顯示出來
[self.window makeKeyAndVisible];
UITabBarControllerDelegate代理
#pragma mark 該方法用于控制TabBarItem能不能選中
- (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController;
改變UITabBarController當(dāng)前顯示視圖的方法
- 改變selectedIndex屬性
- 改變selectedViewController屬性
- 改變viewControllers屬性
三、UINavigationController導(dǎo)航控制器
- UINavigationController中的子控制器以棧的形式存儲,只有在棧頂部的控制器才能顯示在界面上
- 壓棧pushController,出棧popController
- UINavigationController必須有一個根控制器rootViewController
- 子控制器通過navigationController屬性訪問UINavigationController
- 在棧中的子控制器都有一個導(dǎo)航欄navigationBar,通過navigationItem去控制

UINavigationItem屬于MVC中的Model,封裝了要顯示在UINavigationBar上的數(shù)據(jù):
title: 標(biāo)題
titleView :標(biāo)題視圖
leftBarButtonItem :左按鈕
rightBarButtonItem :右按鈕
下一個子視圖左側(cè)返回按鈕leftBarButtonItem的標(biāo)題優(yōu)先級:
- 導(dǎo)航欄返回按鈕backBarButtonItem的標(biāo)題
- 導(dǎo)航欄navigationItem的標(biāo)題
- 視圖控制器的標(biāo)題
UINavigationController常用的主要方法:
#pragma mark 壓棧,把控制器壓入導(dǎo)航控制器子控制器棧中
- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated;
#pragma mark 出棧,把導(dǎo)航控制器子控制器棧的棧頂彈出
- (void)popViewControllerAnimated:(BOOL)animated;
#pragma mark 多次出棧直到棧頂為指定控制器
- (void)popToViewController:(UIViewController *)viewController animated:(BOOL)animated;
#pragma mark 多次出棧直到棧頂為根控制器
- (void)popToRootViewControllerAnimated:(BOOL)animated;
四、模態(tài)窗口
#pragma mark 從下方彈出指定的視圖控制器,賦予模態(tài),即當(dāng)前視圖關(guān)閉前,其他視圖上的內(nèi)容無法操作
- (void)presentViewController:(UIViewController *)viewControllerToPresent animated:(BOOL)flag completion:(void (^)(void))completion;
#pragma mark 關(guān)閉模態(tài)窗口,該方法在模態(tài)窗口中調(diào)用
- (void)dismissViewControllerAnimated:(BOOL)flag completion:(void (^)(void))completion;
相關(guān)文章
iOS?項(xiàng)目嵌入Flutter?運(yùn)行(最新推薦)
這篇文章主要介紹了iOS?項(xiàng)目嵌入Flutter?運(yùn)行,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-03-03
IOS中用正則表達(dá)式判斷輸入的內(nèi)容為8-16位且同時包含數(shù)字和字母
這篇文章主要介紹了IOS中用正則表達(dá)式判斷輸入的內(nèi)容為8-16位且同時包含數(shù)字和字母,需要的朋友可以參考下2017-06-06
詳解iOS AFNetworking取消正在進(jìn)行的網(wǎng)絡(luò)請求
這篇文章主要介紹了詳解iOS AFNetworking取消正在進(jìn)行的網(wǎng)絡(luò)請求,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-06-06
解決JSON數(shù)據(jù)因?yàn)閚ull導(dǎo)致數(shù)據(jù)加載失敗的方法
前段時間發(fā)現(xiàn)一個問題,當(dāng)JSON數(shù)據(jù)中有null會導(dǎo)致數(shù)據(jù)加載失敗,后來解決了,現(xiàn)在將解決方法分享給大家,有同樣問題的朋友們可以參考。下面來一起看看吧。2016-09-09
詳解 swift3.0 可選綁定共用同一塊內(nèi)存空間的實(shí)例
這篇文章主要介紹了詳解 swift3.0 可選綁定共用同一塊內(nèi)存空間的實(shí)例的相關(guān)資料,希望通過本文能幫助到大家,需要的朋友可以參考下2017-09-09
iOS 使用UITextField自定義搜索框 實(shí)現(xiàn)用戶輸入完之后“實(shí)時搜索”功能
這篇文章主要介紹了iOS 使用UITextField自定義搜索框 實(shí)現(xiàn)用戶輸入完之后“實(shí)時搜索”功能,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-03-03
舉例講解設(shè)計(jì)模式中的原型模式在iOS應(yīng)用開發(fā)中的作用
這篇文章主要介紹了設(shè)計(jì)模式中的原型模式在iOS應(yīng)用開發(fā)中的作用,示例代碼為傳統(tǒng)的Objective-C,需要的朋友可以參考下2016-04-04

