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
控制器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è)置”應用
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)
每一個Segue對象,都有3個屬性
唯一標識
@property (nonatomic, readonly) NSString *identifier;
來源控制器
@property (nonatomic, readonly) id sourceViewController;
目標控制器
@property (nonatomic, readonly) id destinationViewController;
4.1Segue的類型
根據(jù)Segue的執(zhí)行(跳轉(zhuǎn))時刻虑凛,Segue可以分為2大類型
1>自動型
:點擊某個控件后(比如按鈕)碑宴,自動執(zhí)行Segue,自動完成界面跳轉(zhuǎn)
2>手動型
:需要通過寫代碼手動執(zhí)行Segue桑谍,才能完成界面跳轉(zhuǎn)
4.1.1自動型Segue
按住Control鍵
延柠,直接從控件拖線
到目標控制器
點擊“登錄”按鈕后奏路,就會自動跳轉(zhuǎn)
到右邊的控制器
如果點擊某個控件后忘闻,不需要做任何判斷,一定要跳轉(zhuǎn)到下一個界面橡卤,建議使用“自動型Segue”
4.1.2手動型Segue
按住Control
鍵,從來源控制器
拖線到目標控制器
手動型的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展示出來
如果點擊某個控件后础浮,需要做一些判斷,也就是說:滿足一定條件后才跳轉(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控件
2>逆?zhèn)?br>
控制器的跳轉(zhuǎn)方向: A --> C 數(shù)據(jù)的傳遞方向 C --> A
數(shù)據(jù)的傳遞方式 : 讓A成為C的代理, 在C中調(diào)用A的代理方法,通過代理方法的參數(shù)傳遞數(shù)據(jù)給A
6.UITabBarController
跟UINavigationController
類似豆同,UITabBarController
也可以輕松地管理多個控制器,輕松完成控制器之間的切換含鳞,典型例子就是QQ影锈、微信等應用
UITabBarController的使用步驟
1>初始化UITabBarController
2>設(shè)置UIWindow
的rootViewController
為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)
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;
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;