UI進階8 Segue Modal UITabBarController

什么是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展示出來

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;
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容