控制器管理

1.如何創(chuàng)建一個控制器

控制器常見的創(chuàng)建方式有以下幾種
1.1通過storyboard創(chuàng)建

//先加載storyboard文件(Test是storyboard的文件名)
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Test" bundle:nil];

//接著初始化storyboard中的控制器
//初始化“初始控制器”(箭頭所指的控制器)
ViewController *vc = [storyboard instantiateInitialViewController];

//通過一個標識初始化對應的控制器
ViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"identifier"];

1.2直接創(chuàng)建 ViewController *vc = [[ViewController alloc] init];

1.3指定xib文件來創(chuàng)建

ViewController *vc = [[ViewController alloc] initWithNibName:@"ViewController" 
                                                      bundle:nil];

2.控制器的view

1-ViewController的view的創(chuàng)建.png

控制器view的延遲加載
2.1控制器的view是延遲加載的:用到時再加載
2.2可以用isViewLoaded方法判斷一個UIViewController的view是否已經(jīng)被加載
2.3控制器的view加載完畢就會調(diào)用viewDidLoad方法

3.多控制器

一個iOS的app很少只有一個控制器組成,除非這個app極其簡單
當app中有多個控制器的時候,我們就需要對這些控制器進行管理
有多個view時擎鸠,可以用一個大的view去管理1個或者多個小view
控制器也是如此箭券,用1個控制器去管理其他多個控制器

比如去枷,用一個控制器A去管理3個控制器B梨与、C拧篮、D
控制器A被稱為控制器B、C、D的“父控制器”
控制器B、C爽丹、D的被稱為控制器A的“子控制器”

為了便于管理控制器,iOS提供了2個比較特殊的控制器

UINavigationController
UITabBarController

3.1UINavigationController

利用UINavigationController辛蚊,可以輕松地管理多個控制器粤蝎,輕松完成控制器之間的切換,典型例子就是系統(tǒng)自帶的“設(shè)置”應用

2-UINavigationController.png
3-UINavigationController的view結(jié)構(gòu).png
4-UINavigationController的view結(jié)構(gòu).png

3.2UINavigationController的使用步驟

1>初始化UINavigationController
2>設(shè)置UIWindow的rootViewController為UINavigationController
3>根據(jù)具體情況袋马,通過push方法添加對應個數(shù)的子控制器

UINavigationController以棧的形式保存子控制器

@property(nonatomic,copy) NSArray *viewControllers;
@property(nonatomic,readonly) NSArray *childViewControllers;

//使用push方法能將某個控制器壓入棧
- (void)pushViewController:(UIViewController *)viewController 
                  animated:(BOOL)animated;

//使用pop方法可以移除控制器
//將棧頂?shù)目刂破饕瞥?- (UIViewController *)popViewControllerAnimated:(BOOL)animated;

//回到指定的子控制器
- (NSArray *)popToViewController:(UIViewController *)viewController 
                        animated:(BOOL)animated;

//回到根控制器(棧底控制器)
- (NSArray *)popToRootViewControllerAnimated:(BOOL)animated;

3.3修改導航欄的內(nèi)容

導航欄的內(nèi)容由棧頂控制器的navigationItem屬性決定

UINavigationItem有以下屬性影響著導航欄的內(nèi)容
左上角的返回按鈕
@property(nonatomic,retain) UIBarButtonItem *backBarButtonItem;
中間的標題視圖
@property(nonatomic,retain) UIView          *titleView;
中間的標題文字
@property(nonatomic,copy)   NSString        *title;
左上角的視圖
@property(nonatomic,retain) UIBarButtonItem *leftBarButtonItem;
右上角的視圖
@property(nonatomic,retain) UIBarButtonItem *rightBarButtonItem;

4.Segue

Storyboard上每一根用來界面跳轉(zhuǎn)的線初澎,都是一個UIStoryboardSegue對象(簡稱Segue)

5-UIStoryboardSegue.png
每一個Segue對象,都有3個屬性
唯一標識
@property (nonatomic, readonly) NSString *identifier;
來源控制器
@property (nonatomic, readonly) id sourceViewController;
目標控制器
@property (nonatomic, readonly) id destinationViewController;
6-UIStoryboardSegue屬性.png

4.1Segue的類型

根據(jù)Segue的執(zhí)行(跳轉(zhuǎn))時刻虑凛,Segue可以分為2大類型
1>自動型:點擊某個控件后(比如按鈕)碑宴,自動執(zhí)行Segue,自動完成界面跳轉(zhuǎn)
2>手動型:需要通過寫代碼手動執(zhí)行Segue桑谍,才能完成界面跳轉(zhuǎn)

4.1.1自動型Segue

按住Control鍵延柠,直接從控件拖線目標控制器

7-自動型UIStoryboardSegue.png

點擊“登錄”按鈕后奏路,就會自動跳轉(zhuǎn)到右邊的控制器
如果點擊某個控件后忘闻,不需要做任何判斷,一定要跳轉(zhuǎn)到下一個界面橡卤,建議使用“自動型Segue”

4.1.2手動型Segue

按住Control鍵,從來源控制器拖線到目標控制器

8-手動型UIStoryboardSegue.png

手動型的Segue需要設(shè)置一個標識

在恰當?shù)臅r刻榜跌,使用perform方法執(zhí)行對應的Segue

[self performSegueWithIdentifier:@"login2contacts" sender:nil];
// Segue必須由來源控制器來執(zhí)行,也就是說盅粪,這個perform方法必須由來源控制器來調(diào)用
1>根據(jù)identifier去storyboard中找到對應的線钓葫,新建UIStoryboardSegue對象
  設(shè)置Segue對象的sourceViewController(來源控制器)
  新建并且設(shè)置Segue對象的destinationViewController(目標控制器)
2>調(diào)用sourceViewController的下面方法,做一些跳轉(zhuǎn)前的準備工作并且傳入創(chuàng)建好的Segue對象

  - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender;
  // 這個sender是當初performSegueWithIdentifier:sender:中傳入的sender
3>調(diào)用Segue對象的

  - (void)perform;方法開始執(zhí)行界面跳轉(zhuǎn)操作

  如果segue的style是push
  取得sourceViewController所在的UINavigationController
  調(diào)用UINavigationController的push方法將destinationViewController壓入棧中票顾,完成跳轉(zhuǎn)

  如果segue的style是modal
  調(diào)用sourceViewController的presentViewController方法將destinationViewController展示出來
9-Sender參數(shù)的傳遞.png

如果點擊某個控件后础浮,需要做一些判斷,也就是說:滿足一定條件后才跳轉(zhuǎn)到下一個界面奠骄,建議使用“手動型Segue”

5.控制器的數(shù)據(jù)傳遞

控制器之間的數(shù)據(jù)傳遞主要有2種情況:順傳和逆?zhèn)?br> 1>順傳
控制器的跳轉(zhuǎn)方向: A --> C 數(shù)據(jù)的傳遞方向 A --> C
數(shù)據(jù)的傳遞方式 : 在A的prepareForSegue:sender:方法中根據(jù)segue參數(shù)取得destinationViewController, 也就是控制器C, 直接給控制器C傳遞數(shù)據(jù),要在C的viewDidLoad方法中取得數(shù)據(jù),來賦值給界面上的UI控件

10-順傳.png

2>逆?zhèn)?br> 控制器的跳轉(zhuǎn)方向: A --> C 數(shù)據(jù)的傳遞方向 C --> A
數(shù)據(jù)的傳遞方式 : 讓A成為C的代理, 在C中調(diào)用A的代理方法,通過代理方法的參數(shù)傳遞數(shù)據(jù)給A

11-逆?zhèn)?png

6.UITabBarController

UINavigationController類似豆同,UITabBarController也可以輕松地管理多個控制器,輕松完成控制器之間的切換含鳞,典型例子就是QQ影锈、微信等應用

12-UITabBarController.png
13-UITabBarController的view結(jié)構(gòu).png
14-UITabBarController的view結(jié)構(gòu).png

UITabBarController的使用步驟
1>初始化UITabBarController
2>設(shè)置UIWindowrootViewController為UITabBarController
3>根據(jù)具體情況,通過addChildViewController方法添加對應個數(shù)的子控制器

UITabBarController的子控制器

UITabBarController添加控制器的方式有2種
添加單個子控制器
- (void)addChildViewController:(UIViewController *)childController;

設(shè)置子控制器數(shù)組
@property(nonatomic,copy) NSArray *viewControllers;

6.1UITabBar

如果UITabBarController有N個子控制器蝉绷,那么UITabBar內(nèi)部就會有N個UITabBarButton作為子控件
如果UITabBarController有4個子控制器鸭廷,UITabBar的結(jié)構(gòu)

15-UITabBar.png
6.1.1UITabBarButton

UITabBarButton里面顯示什么內(nèi)容,由對應子控制器的tabBarItem屬性決定

UITabBarItem有以下屬性影響著UITabBarButton的內(nèi)容

標題文字
@property(nonatomic,copy) NSString *title;

圖標
@property(nonatomic,retain) UIImage *image;

選中時的圖標
@property(nonatomic,retain) UIImage *selectedImage;

提醒數(shù)字
@property(nonatomic,copy) NSString *badgeValue;
16-UITabBarItem.png
17-App主流UI框架結(jié)構(gòu).png

7.Modal

除了push之外熔吗,還有另外一種控制器的切換方式辆床,那就是Modal
任何控制器都能通過Modal的形式展示出來
Modal的默認效果:新控制器從屏幕的最底部往上鉆,直到蓋住之前的控制器為止

//以Modal的形式展示控制器
- (void)presentViewController:(UIViewController *)viewControllerToPresent 
                     animated:(BOOL)flag 
                   completion:(void (^)(void))completion

//關(guān)閉當初Modal出來的控制器
- (void)dismissViewControllerAnimated:(BOOL)flag 
                           completion:(void (^)(void))completion;
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末桅狠,一起剝皮案震驚了整個濱河市讼载,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌中跌,老刑警劉巖咨堤,帶你破解...
    沈念sama閱讀 218,386評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異晒他,居然都是意外死亡吱型,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評論 3 394
  • 文/潘曉璐 我一進店門陨仅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來津滞,“玉大人,你說我怎么就攤上這事灼伤〈バ欤” “怎么了?”我有些...
    開封第一講書人閱讀 164,704評論 0 353
  • 文/不壞的土叔 我叫張陵狐赡,是天一觀的道長撞鹉。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么鸟雏? 我笑而不...
    開封第一講書人閱讀 58,702評論 1 294
  • 正文 為了忘掉前任享郊,我火速辦了婚禮,結(jié)果婚禮上孝鹊,老公的妹妹穿的比我還像新娘炊琉。我一直安慰自己,他們只是感情好又活,可當我...
    茶點故事閱讀 67,716評論 6 392
  • 文/花漫 我一把揭開白布苔咪。 她就那樣靜靜地躺著,像睡著了一般柳骄。 火紅的嫁衣襯著肌膚如雪团赏。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,573評論 1 305
  • 那天耐薯,我揣著相機與錄音舔清,去河邊找鬼。 笑死可柿,一個胖子當著我的面吹牛鸠踪,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播复斥,決...
    沈念sama閱讀 40,314評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼营密,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了目锭?” 一聲冷哼從身側(cè)響起评汰,我...
    開封第一講書人閱讀 39,230評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎痢虹,沒想到半個月后被去,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,680評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡奖唯,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,873評論 3 336
  • 正文 我和宋清朗相戀三年惨缆,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片丰捷。...
    茶點故事閱讀 39,991評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡坯墨,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出病往,到底是詐尸還是另有隱情捣染,我是刑警寧澤,帶...
    沈念sama閱讀 35,706評論 5 346
  • 正文 年R本政府宣布停巷,位于F島的核電站耍攘,受9級特大地震影響榕栏,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蕾各,卻給世界環(huán)境...
    茶點故事閱讀 41,329評論 3 330
  • 文/蒙蒙 一扒磁、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧示损,春花似錦渗磅、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽仔掸。三九已至脆贵,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間起暮,已是汗流浹背卖氨。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留负懦,地道東北人筒捺。 一個月前我還...
    沈念sama閱讀 48,158評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像纸厉,于是被迫代替她去往敵國和親系吭。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,941評論 2 355

推薦閱讀更多精彩內(nèi)容