在 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 展示出来