一、視圖切換
- 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;