UIKit (3)----視圖切換UITabBarController UINavigationController 模態窗口

一、簡介

在iOS開發中視圖的切換是很頻繁的,獨立的視圖應用在實際開發過程中并不常見,除非你的應用足夠簡單。在iOS開發中常用的視圖切換有三種,這三種視圖切換的原理各不相同:

  • UITabBarController :以平行的方式管理視圖,各個視圖之間往往關系并不大,每個加入到UITabBarController的視圖都會進行初始化即使當前不顯示在界面上,相對比較占用內存。
  • UINavigationController:以棧的方式管理視圖,各個視圖的切換就是壓棧和出棧操作,出棧后的視圖會立即銷毀。
  • 模態窗口:以模態窗口的形式管理視圖,當前視圖關閉前其他視圖上的內容無法操作。

二、UITabBarController

  1. 介紹

UITabBarController是Apple專門為了利用頁簽切換視圖而設計的,在這個視圖控制器中有一個UITabBar控件,用戶通過點擊tabBar進行視圖切換。我們知道在UIViewController內部有一個視圖,一旦創建了UIViewController之后默認就會顯示這個視圖,但是UITabBarController本身并不會顯示任何視圖,如果要顯示視圖則必須設置其viewControllers屬性(它默認顯示viewControllers[0])。這個屬性是一個數組,它維護了所有UITabBarController的子視圖。為了盡可能減少視圖之間的耦合,所有的UITabBarController的子視圖的相關標題、圖標等信息均由子視圖自己控制,UITabBarController僅僅作為一個容器存在。下面顯示了UITabBarController的效果:


UITabBarController效果圖
  1. 使用方法

主要流程

  • 在AppDelegate中創建TabBarController和需要加載的ViewController。比如分別為tabBar, firstPage, secondPage
  • 把視圖裝進tabBar的viewControllers屬性:tabBar.viewControllers = @[firstPage, secondPage];
  • 加載tabBar

修飾

  • UITabBarController會一次性初始化所有子控制器,但是默認只加載第一個控制器視圖,其他視圖控制器只初始化默認不會加載,為了能夠將其他子控制器也正常顯示在Tab bar中我們訪問了每個子視圖控制器的視圖以便調用其視圖加載方法(viewDidLoad)具體操作:
    for (UIViewController *controller in tabBar.viewControllers) {
    UIView *view = controller.view;
    }
  • 每個視圖控制器都有一個tabBarItem屬性,通過它控制視圖在UITabBarController的tabBar中的顯示信息,tabBarItem的屬性主要有
    • title
    • image
    • selectedImage
    • badgeValue
  • tabBarItem的image屬性必須是png格式(建議大小32*32)并且打開alpha通道否則無法正常顯示。
  • 每個視圖控制器都有一個tabBarController屬性,通過它可以訪問所在的UITabBarController

三、UINavigationController

  1. 介紹

UINavigationController是一個導航控制器,它用來組織有層次關系的視圖,在UINavigationController中子控制器以棧的形式存儲,只有在棧頂的控制器能夠顯示在界面中,一旦一個子控制器出棧則會被銷毀。UINavigationController默認也不會顯示任何視圖(這個控制器自身的UIView不會顯示),它必須有一個根控制器rootViewController,而且這個根控制器不會像其他子控制器一樣被銷毀。

下面顯示了UITabBarController的效果:


UINavigationController效果圖
  1. 使用方法

主要流程

  • 創建視圖控制器root, firstPage, secondPage
  • 在AppDelegate中創建NavigationController并設置其根控制器
    RootViewController *root = [[RootViewController alloc] init];
    UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:tabBar];
  • window的rootViewController設置為nav
  • 導航跳轉動作為堆棧操作,在子視圖中可以通過navigationController訪問導航控制器, 然后使用pushViewController 方法把FirstPage推進棧內,animated表示切換視圖時的動畫效果:滑入還是簡單切換
    [self.navigationController pushViewController:FirstPage animated:Yes];

修飾

  • 在AppDelegate中設置導航欄的全局外觀
    [[UINavigationBar appearance] setBarTintColor:[UIColor orangeColor]];
    [[UINavigationBar appearance] setBarStyle:UIBarStyleBlack];

  • 在各個層級視圖中設置導航欄的選項內容主要有:

    • self.navigationItem.title
    • self.navigationItem.leftBarButtonItem
    • self.navigationItem.rightBarButtonItem
  • UINavigationController導航是通過上方導航欄進行的(類似的UITabBarController是通過下方UITabBar進行導航),每個放到UINavigationController棧中的子視圖都會顯示一個導航欄,可以通過子控制器(包括根控制器)的navigationItem訪問這個導航欄,修改其左右兩邊的按鈕內容。

  • 默認情況下除了根控制器之外的其他子控制器左側都會在導航欄左側顯示返回按鈕,點擊可以返回上一級視圖,同時按鈕標題默認為上一級視圖的標題,可以通過backBarButtonItem修改。下一級子視圖左側返回按鈕上的標題的顯示優先級為: 導航欄返回按鈕backBarButtonItem的標題(注意不能直接給backBarButtonItem的標題賦值,只能重新給backBarButtonItem賦值)、導航欄navigationItem的標題,視圖控制器標題。

Tips 使用系統自帶的UIBarButtonItem

typedef NS_ENUM(NSInteger, UIBarButtonSystemItem) {
    UIBarButtonSystemItemDone,
    UIBarButtonSystemItemCancel,
    UIBarButtonSystemItemEdit,  
    UIBarButtonSystemItemSave,  
    UIBarButtonSystemItemAdd,
    UIBarButtonSystemItemFlexibleSpace,
    UIBarButtonSystemItemFixedSpace,
    UIBarButtonSystemItemCompose,
    UIBarButtonSystemItemReply,
    UIBarButtonSystemItemAction,
    UIBarButtonSystemItemOrganize,
    UIBarButtonSystemItemBookmarks,
    UIBarButtonSystemItemSearch,
    UIBarButtonSystemItemRefresh,
    UIBarButtonSystemItemStop,
    UIBarButtonSystemItemCamera,
    UIBarButtonSystemItemTrash,
    UIBarButtonSystemItemPlay,
    UIBarButtonSystemItemPause,
    UIBarButtonSystemItemRewind,
    UIBarButtonSystemItemFastForward,
    UIBarButtonSystemItemUndo NS_ENUM_AVAILABLE_IOS(3_0),
    UIBarButtonSystemItemRedo NS_ENUM_AVAILABLE_IOS(3_0),
    UIBarButtonSystemItemPageCurl NS_ENUM_AVAILABLE_IOS(4_0),

};

按鈕圖標

四、模態窗口

模態窗口使用起來比較容易,一般的視圖控制器只要調用兩個方法

  • [self presentViewController:secondPage animated:YES completion:nil];切換到secondPage視圖
  • [self dismissViewControllerAnimated:YES completion:nil];注銷當前視圖返回上一級視圖

這兩種方法通過頁面按鈕來觸發。

1
1

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,002評論 6 542
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,400評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,136評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,714評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,452評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,818評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,812評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,997評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,552評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,292評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,510評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,035評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,721評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,121評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,429評論 1 294
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,235評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,480評論 2 379

推薦閱讀更多精彩內容

  • 今天又是周五了一天天的過得好快,這句總是情不自禁的感嘆!下面給大家分享下視圖的切換,其實這是我們的基本功,只是有時...
    碼農冰冰閱讀 1,407評論 1 0
  • 廢話不多說,直接上干貨 ---------------------------------------------...
    小小趙紙農閱讀 3,405評論 0 15
  • 發現 關注 消息 iOS 第三方庫、插件、知名博客總結 作者大灰狼的小綿羊哥哥關注 2017.06.26 09:4...
    肇東周閱讀 12,170評論 4 61
  • 多控制器切換. 1.概述. 在iOS開發中,視圖的切換是很頻繁的,常用的視圖切換如下: UITabBarContr...
    ValienZh閱讀 1,991評論 0 6
  • 你在天空等待著誰 你這顆明星屬于誰 誰能夠迷住漂亮的你 我想他一定是一個陽光帥氣的男孩 我想在你與他四目相對時你的...
    素曉閱讀 229評論 0 0