● Storyboard上每一根用来界面跳转的线,都是一个UIStoryboardSegue对象(简称Segue)
Segue的属性
● 每一个Segue对象,都有3个属性
➢ 唯一标识
@property (nonatomic, readonly) NSString *identifier;
➢ 来源控制器
@property (nonatomic, readonly) id sourceViewController;
➢ 目标控制器
@property (nonatomic, readonly) id destinationViewController;
● 根据Segue的执行(跳转)时刻,Segue可以分为2大类型
➢ 自动型:点击某个控件后(比如按钮),自动执行Segue,自动完成界面跳转
➢ 手动型:需要通过写代码手动执行Segue,才能完成界面跳转
1. 调用sourceViewController的下面方法,做一些跳转前的准备工作并且传入创建好的 Segue对象
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:
(id)sender;
// 这个sender是当初performSegueWithIdentifier:sender:中传入的sender
2. 调用Segue对象的- (void)perform;方法开始执行界面跳转操作
➢ 取得sourceViewController所在的UINavigationController
➢ 调用UINavigationController的push方法将destinationViewController压入栈中,完成跳转
无论是手动类型的segue还是自动类型的segue, 在跳转之前都会执行prepareForSegue方法
● 在恰当的时刻,使用perform方法执行对应的Segue
// Segue必须由来源控制器来执行,也就是说,这个perform方法必须由来源控制器来调用
[self performSegueWithIdentifier:@"login2contacts" sender:nil];
- (IBAction)loginOnClick:(UIButton *)sender { // 添加蒙版禁止用户操作, 并且提示用户正在登录 [MBProgressHUD showMessage:@"正在拼命加载ing...."]; dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ if (![self.accountField.text isEqualToString:@"lnj"]) { // 3.登录成功后移除蒙版 [MBProgressHUD hideHUD]; [MBProgressHUD showError:@"用户名不正确!!!"]; return; } if (![self.pwdField.text isEqualToString:@"123"]) { // 3.登录成功后移除蒙版 [MBProgressHUD hideHUD]; [MBProgressHUD showError:@"密码不正确!!!"]; return; } // 3.登录成功后移除蒙版 [MBProgressHUD hideHUD]; // 2.如果正如,跳转到联系人界面(手动执行segue) [self performSegueWithIdentifier:@"login2contatc" sender:@"jonathan"]; }); } // 在segue跳转之前调用, 会传入performSegueWithIdentifier方法创建好的segue对象 - (void):(UIStoryboardSegue *)segue sender:(id)sender { NSLog(@"%@", sender); NSLog(@"%@, %@ %@",segue.identifier, segue.sourceViewController, segue.destinationViewController); // 1.拿到目标控制器 UIViewController *vc = segue.destinationViewController; // 2.设置目标控制器的标题 vc.title = [NSString stringWithFormat:@"%@ 的联系人列表", self.accountField.text]; /* // 执行segue的perform内部实现 UIViewController *sourceVc = segue.sourceViewController; UINavigationController *nav = sourceVc.navigationController; [nav pushViewController:segue.destinationViewController animated:YES]; */ }
// 无论是手动类型的segue还是自动类型的segue, 在跳转之前都会执行该方法 - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { /* // 取出目标控制器 NJEditViewController *editVc = (NJEditViewController *)segue.destinationViewController; // 设置来源控制器给目标控制器的属性 editVc.vc = self; */ // 1.取出目标控制器 NJAddViewController *editVc = (NJAddViewController *)segue.destinationViewController; // 2.设置代理 editVc.delegate = self; }