IOS segue(跳转页面处理)

● 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;
}
原文地址:https://www.cnblogs.com/liuwj/p/6528346.html