什么是Segue
- Storyboard上每一根用來界面跳轉的線,都是一個UIStoryboardSegue對象(簡稱Segue)
Segue的屬性
- 每一個Segue對象,都有3個屬性
唯一標識
@property (nonatomic, readonly) NSString *identifier;
來源控制器
@property (nonatomic, readonly) id sourceViewController;
目標控制器
@property (nonatomic, readonly) id destinationViewController;
Segue的類型
- 根據Segue的執行(跳轉)時刻,Segue可以分為2大類型
- 自動型:點擊某個控件后(比如按鈕),自動執行Segue,自動完成界面跳轉
- 手動型:需要通過寫代碼手動執行Segue,才能完成界面跳轉
自動型Segue
- 按住Control鍵,直接從控件拖線到目標控制器
- 如果點擊某個控件后,不需要做任何判斷,一定要跳轉到下一個界面,建議使用“自動型Segue”
手動型Segue
- 按住Control鍵,從來源控制器拖線到目標控制器
- 手動型的Segue需要設置一個標識
- 在恰當的時刻,使用perform方法執行對應的Segue
[self performSegueWithIdentifier:@"login2contacts" sender:nil];
// Segue必須由來源控制器來執行,也就是說,這個perform方法必須由來源控制器來調用
- 如果點擊某個控件后,需要做一些判斷,也就是說:滿足一定條件后才跳轉到下一個界面,建議使用“手動型Segue”
performSegueWithIdentifier:sender:
利用performSegueWithIdentifier:方法可以執行某個Segue,完成界面跳轉
接下來研究performSegueWithIdentifier:sender:方法的完整執行過程
[self performSegueWithIdentifier:@“login2contacts” sender:nil];
// 這個self是來源控制器
- 根據identifier去storyboard中找到對應的線,新建UIStoryboardSegue對象
- 設置Segue對象的sourceViewController(來源控制器)
- 新建并且設置Segue對象的destinationViewController(目標控制器)
- 調用sourceViewController的下面方法,做一些跳轉前的準備工作并且傳入創建好的Segue對象
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender;
// 這個sender是當初performSegueWithIdentifier:sender:中傳入的sender
- 調用Segue對象的-(void)perform;方法開始執行界面跳轉操作
- 如果segue的style是push
- 取得sourceViewController所在的UINavigationController
- 調用UINavigationController的push方法將destinationViewController壓入棧中,完成跳轉
- 如果segue的style是modal
- 調用sourceViewController的presentViewController方法將destinationViewController展示出來
- 如果segue的style是push
Sender參數的傳遞
[self performSegueWithIdentifier:@“login2contacts” sender:@“jack”];
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender;
控制器的數據傳遞
-
控制器之間的數據傳遞主要有2種情況:順傳和逆傳
- 順傳
控制器的跳轉方向: A C
數據的傳遞方向 : A C
-
數據的傳遞方式 : 在A的prepareForSegue:sender:方法中根據segue參數取得destinationViewController, 也就是控制器C, 直接給控制器C傳遞數據
(要在C的viewDidLoad方法中取得數據,來賦值給界面上的UI控件)- 逆傳
控制器的跳轉方向: A C
數據的傳遞方向 : C A
數據的傳遞方式 : 讓A成為C的代理, - - -
在C中調用A的代理方法,通過代理方法的參數傳遞數據給A
UITabBarController
- 跟UINavigationController類似,UITabBarController也可以輕松地管理多個控制器,輕松完成控制器之間的切換,典型例子就是QQ、微信等應用
UITabBarController的簡單使用
- UITabBarController的使用步驟
- 初始化UITabBarController
- 設置UIWindow的rootViewController為UITabBarController
- 根據具體情況,通過addChildViewController方法添加對應個數的子控制器
UITabBarController的子控制器
- UITabBarController添加控制器的方式有2種
添加單個子控制器
- (void)addChildViewController:(UIViewController *)childController;
設置子控制器數組
@property(nonatomic,copy) NSArray *viewControllers;
UITabBar
如果UITabBarController有N個子控制器,那么UITabBar內部就會有N個UITabBarButton作為子控件
如果UITabBarController有4個子控制器,那么UITabBar的結構大致如微信下邊一條
UITabBarButton
- UITabBarButton里面顯示什么內容,由對應子控制器的tabBarItem屬性決定
- UITabBarItem有以下屬性影響著UITabBarButton的內容
標題文字
@property(nonatomic,copy) NSString *title;
圖標
@property(nonatomic,retain) UIImage *image;
選中時的圖標
@property(nonatomic,retain) UIImage *selectedImage;
提醒數字
@property(nonatomic,copy) NSString *badgeValue;
Modal
除了push之外,還有另外一種控制器的切換方式,那就是Modal
任何控制器都能通過Modal的形式展示出來
Modal的默認效果:新控制器從屏幕的最底部往上鉆,直到蓋住之前的控制器為止
以Modal的形式展示控制器
- (void)presentViewController:(UIViewController *)viewControllerToPresent animated: (BOOL)flag completion:(void (^)(void))completion
關閉當初Modal出來的控制器
- (void)dismissViewControllerAnimated: (BOOL)flag completion: (void (^)(void))completion;