如何創建一個控制器
控制器常見的創建方式有以下幾種:
1. 通過storyboard創建
> 直接創建
UIViewController *vc = [[UIViewController alloc] init];
> 指定xib文件來創建
UIViewController *vc = [[UIViewController alloc] initWithNibName:@“UIViewController” bundle:nil];
通過storyboard創建控制器
先加載storyboard文件
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@“Test” bundle:nil];
> 接著初始化storyboard中的控制器
> 初始化控制器(箭頭所指的控制器)
UIViewController * vc = [storyboard instantiateViewController];
> 通過一個標識初始化對應的控制器
UIViewController *vc = [storyboard instantiateViewControllerWithIndentifier:@“vc”];
控制器view的延遲加載
- 控制器view是延遲加載的:用到時再加載
- 可以用isViewLoaded方法判斷一個UIViewController的view是否已經被加載
- 控制器的view加載完畢就會調用viewDidLoad方法
多控制器
UINavigationController
UINavigationController的使用步驟:
1. 初始化UINavigationController
2. 設置UIWindow的rootViewController為UINavigationController
3. 根據具體清空,通過push方法添加對應個數的子控制器
UINavigationController的子控制器
UINavigationController以棧的形式保存子控制器
@property(nonatomic, copy) NSArray *viewControllers;
@property(nonatomic, readonly) NSArray *childViewController;
使用push方法能將某個控制器壓入棧
- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated;
使用pop方法可以移除控制器
> 將棧頂的控制器移除
- (UIViewController *)popViewControllerAnimated:(BOOL)animated;
> 回到指定的子控制器
- (NSArray *)popToViewController:(UIViewController *)viewController animated:(BOOL)animated;
> 回到根控制器(棧底控制器器)
- (NSArray *)popToRootViewControllerAnimated:(BOOL)animated;
修改導航欄的內容
- 導航欄的內容由棧頂控制器的navigationItem屬性決定
UINavigationItem有以下屬性影響導航欄的內容:
// 左上角的返回按鈕
@property(nonatomic, retain) UIBarButtonItem *backBarButtonItem;
// 中間的標題視圖
@property(nonatomic, retain) UIView *titleView;
// 中間的標題文字
@property(nonatomic, copy) NSString *title;
// 左上角的視圖
@property(nonatomic,retain) UIBarButtonItem *leftBarButtonItem;
// UIBarButtonItem *rightBarButtonItem 右上角的視圖
@property(nonatomic,retain) UIBarButtonItem *rightBarButtonItem;
Segue
- Storyboard上每一個用來界面跳轉的線,都是一個UIStoryboardSegue對象(簡稱Segue)
Segue的屬性
每一個Segue對象,都有3個屬性
// 唯一標識
@property(nonatomic, readonly) NSString *identifier;
// 來源控制器
@property(nonatomic, readonly) id sourceViewController;
// 目標控制器
@property(nonatomic, readonly) id destinationViewController;
identifier.png
segue.png
Segue的類型
- 根據Segue的執行(跳轉)時刻,Segue可以分為2大類型
- 自動型:點擊某個控件后(比如按鈕),自動執行Segue,自動完成界面跳轉
- 手動型:需要通過寫代碼手動執行Segue,才能完成界面跳轉(如果點擊某個控件后,需要做一些判斷,滿足一定條件后才跳轉到下一個界面)
自動型Segue步驟: 按住Control鍵,直接從控件拖線到目標控制器
手動型Segue步驟:
- 連接目標控制器
- 設置Segue的唯一標識
- 使用perform方法執行對應的Segue
// perform方法必須由源控制器來執行
[self performSegueWithIdentifier:@"login2contacts" sender:nil];
> 利用performSegueWithIdentifier:方法可以執行某個Segue,完成界面跳轉
> 根據identifier去storyboard中找到對應的線,新建UIStoryboardSegue對象
> 設置Segue對象的sourceViewController(來源控制器)
> 新建并且設置Segue對象的destinationViewController(目標控制器)
// 調用sourceViewController的下面方法,做一些跳轉前的準備工作并且傳入創建好的Segue對象
// 這個sender是當初performSegueWithIdentifier:sender:中傳入的sender
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender;
調用Segue對象的-(void)perform;方法開始執行界面跳轉操作
(1)如果segue的style是push
取得sourceViewController所在的UINavigationController
調用UINavigationController的push方法將destinationViewController壓入棧中,完成跳轉
(2)如果segue的style是modal
調用sourceViewController的presentViewController方法將destinationViewController展示出來
Sender參數的傳遞
[self performSegueWithIdentifier:@“login2contacts” sender:@“jack”];
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender;
控制器的參數傳遞
UITabBarController的簡單使用
UITabBarController的使用步驟:
1. 初始化UITabBarController
2. 設置UIWindow的rootViewController為UITabBarController
3. 根據具體情況,通過addChildViewController方法添加對應個數的子控制器
UITabBarController的子控制器
- UITabBarController添加控制器的方式有2種:
// 添加單個子控制器
- (void)addChildViewController:(UIViewController *)childController;
// 設置子控制器數組
@property(nonatomic, copy) NSArray *viewController;
UITabBar
- 如果UITabBarController有N個子控制器,那么UITabBar內部就會有N個UITabBarButton作為子控件
- 如果UITabBarController有4個子控制器,那么UITabBar的結構大致如下圖所示
UITabBar.png
UITabBarButton
UITabBarButton的內容由對應的子控制器的tabBarItem屬性決定
// 標題文字
@property(nonatomic, copy) NSString *title;
// 圖標
@property(nonatomic, retain) UIImage *image;
// 選中的圖標
@property(nonatomic, retain) UIImage *selectedImage;
// 提醒數字
@property(nonatomic, copy) NSString *badgeValue;
App主流UI框架結構
框架結構.png
Modal
- Modal的默認效果: 新控制器從屏幕的最底部往上鉆,直到蓋住之前的控制器為止
// 以Modal的形式展示控制器
- (void)presentViewController:(UIViewController *)viewControllerToPresent animated: (BOOL)flag completion:(void (^)(void))completion
// 關閉當初Modal出來的控制器
- (void)dismissViewControllerAnimated:(BOOL)flag completion: (void (^)(void))completion;