浅谈控制器传值之属性传值与segue传值

导读

我们在进行程序编写时,往往需要在界面控制器跳转时传值.此处抛开block,代理逆传,谈一谈我所遇到的顺传问题,希望对需要的人有用


属性传值

  • 此方法对于storyboard无效
  • 接收方一定要有属性去接收
  • 传递方需要拿到接收方,进行直接赋值
  • 拿到下一级控制器,对其.h文件中的属性进行赋值
  • 一定要进行push操作
  • 实现代码

上一级控制器

/**
    此处以tableView的cell点击方法为例,将tableview的模型属性传给下一级控制器
*/
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
// 获取模型
OAModel *model = self.modelArrs[indexPath.row];
// 获取目标控制器
OADetailsController *deVc = [[OADetailsController alloc] init];
// 对目标控制器属性进行赋值
deVc.model = model;
// push到目标控制器
[self.navigationController pushViewController:deVc animated:YES];
}

下一级控制器.h

// 接收属性
@property (nonatomic,strong) OAModel *model;

下一级控制器.m

//拿到赋值属性直接使用    
self.navigationItem.title = self.model.title;

segue传值


认识segue

  • 什么是Segue

    • Storyboard上每一根用来界面跳转的线,都是一个UIStoryboardSegue对象(简称Segue)
  • Segue的属性

    • 唯一标识:@property (nonatomic, readonly) NSString *identifier;
    • 来源控制器:@property (nonatomic, readonly) id sourceViewController;
  • 目标控制器:@property (nonatomic, readonly) id destinationViewController;

  • Segue的分类

    • 自动型:点击某个控件后(比如按钮),自动执行Segue,自动完成界面跳转
    • 自动进行跳转不需要进行判断建议用自动型Segue
  • 手动型:需要通过写代码手动执行Segue,才能完成界面跳转

    • 手动型的Segue需要设置一个标识(Identifier)

    • 在恰当的时刻,使用perform方法执行对应的Segue,完成界面跳转
      [self performSegueWithIdentifier:@"sendValue" sender:nil];
      // Segue必须由来源控制器来执行,也就是说,这个perform方法必须由来源控制器来调用

    • 如果点击某个控件后,需要做一些判断,也就是说:满足一定条件后才跳转到下一个界面,建议使用“手动型Segue”

  • 方法实现过程

来源控制器中实现

   /**
        此处以tableView的cell点击方法为例,将tableview的模型属性传给下一级控制器,
        Segue从cell拖线至下一级控制器
    */
  - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
  if ([segue.identifier isEqualToString:@"SendValue"]) {
    // 获取目标控制器
    UIViewController *vc = segue.destinationViewController;
    // 获取当前点击cell的索引 sender为当前点击的cell
    NSIndexPath *indexPath = [self.tableView indexPathForCell:sender];
    // 取出模型
    OAModel *model = self.modelArrs[indexPath.row];
    // 进行赋值
    // value:要赋的值
    // key:下一级控制器接收的同名属性
    [vc setValue:model forKey:@"model"];
  }  
}

目标控制器.h实现

  // 属性要和来源控制器key值同名
@property (nonatomic,strong) OAModel *model;

目标控制器.m实现

  // 拿到赋值属性直接使用
self.navigationItem.title = self.model.title;

-希望对大家有所帮助-

你可能感兴趣的:(浅谈控制器传值之属性传值与segue传值)