【原】iOS学习之UIStoryboardSegue解析

 在 Storyboard 的可视化编程中,跳转界面就是按住 Ctrl 使用鼠标头一条连线就可以解决,相当的简单!本篇博客主要就是介绍这条连线,在iOS中,这条连线也是一个对象,也有其自己的初始化方法和属性。这个对象就是 UIStoryboardSegue 。

 以前在 可视化编程-Storyboard也介绍过 UIStoryboardSegue 的概述和自定义

1、Segue的属性

 每一个 Segue 对象,都有3个属性

// 唯一标识
@property (nullable, nonatomic, copy, readonly) NSString *identifier;
// 来源控制器
@property (nonatomic, readonly) __kindof UIViewController *sourceViewController;
// 目标控制器
@property (nonatomic, readonly) __kindof UIViewController *destinationViewController;

2、Segue的类型

 根据Segue的执行(跳转)时刻,Segue可以分为2大类类型:

  • 自动型:点击某个控件后(比如按钮),自动执行Segue,自动完成页面跳转

  按住 Ctrl 键,直接从控件拖线到目标控制器生成的关系连线

  点击 "登录" 按钮后,就会自动跳转到右边的控制器

  使用情况:如果点击某个控件后,不需要做任何判断,一定要跳转到下一界面,建议使用 "自动型Segue"

  • 手动型: 需要通过写代码手动执行Segue,才能完成页面跳转

  按住 Ctrl 键,从来源控制器拖线到目标控制器生成的关系连线

  手动型设置唯一标识如下图:

  在恰当的时刻,使用 performSegueWithIdentifier: sender: 方法执行对应的 Segue,完成界面跳转,方法如下:

// 这个方法是UIViewController的一个方法
// 参数1:表示上述手动型Segue的标识符
// 参数2:传递的东西,不使用时置为nil
- (void)performSegueWithIdentifier:(NSString *)identifier sender:(nullable id)sender

  代码实例:

#pragma mark - 登录按钮按钮
- (IBAction)loginBtnAction:(id)sender
{
    // 提示用户,正在登录ing...
    [MBProgressHUD showMessage:@"正在登录ing..."];
    
    // 模仿延迟登录
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        
        // 隐藏蒙版
        [MBProgressHUD hideHUD];
//        UIStoryboardSegue
        if ([_accountTextFiled.text isEqualToString:@"zf"] && [_pwdTextField.text isEqualToString:@"123"]) { // 输入正确
            // 跳转到联系人界面
            [self performSegueWithIdentifier:@"login2ContactList" sender:nil];
            
        } else { // 输入正确
            [MBProgressHUD showError:@"用户或密码输入错误"];
        }
    });
    
}

3、segue 跳转界面的原理

 segue 跳转界面的原理实际上就是 performSegueWithIdentifier: sender: 方法的完整执行过程。

下面我们来研究一下performSegueWithIdentifier: sender: 方法的完整执行过程

// self 为来源控制器
[self performSegueWithIdentifier:@"login2ContactList" sender:nil];

  执行过程:

  • 根据 Identifier 去 Storyboard 中找到对应的线,新建 UIStoryboardSegue对象。

  • 设置 Segue 对象的 sourceViewController(来源控制器)

  • 新建并且设置 Segue 对象的 destinationViewController(目标控制器)

  • 调用 sourceViewController 的 prepareForSegue: sender: 方法做一些跳转之前的准备工作并传入之前创建好的 Segue 对象

// 这个 sender 就是当初performSegueWithIdentifier: sender: 中传入的 sender
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(nullable id)sender;
  • 调用 Segue 对象的 - (void)perform; 方法开始执行界面跳转操作

 (1)如果 Segue 的 Style 是 push

   取得 sourceViewController 所在的 UINavigationController

   调用 UINavigationController 的 push 方法将 destinationViewController 压入栈中,完成跳转

 (2)如果 Segue 的 Style 是 Model

   调用 sourceViewController 的presentViewController 方法将 destinationViewController 展示出来

 

posted @ 2016-06-05 11:49  墨隐于非  阅读(1035)  评论(0编辑  收藏  举报