浅谈控制器传值之属性传值与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;

-希望对大家有所帮助-

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 导读: iOS开发中,你肯定遇到过控制器之间的值或模型的传递,本文将从两种创建控制器的方式&两种值传递的方向,分别...
    Developer_Yancy阅读 3,816评论 4 29
  • 笔记 Xmind PPT 1-控制器管理 控制器以及view的多种创建方式 UINavigationControl...
    CoderZXS阅读 453评论 0 0
  • 文 || 張贺 什么是Segue Storyboard上每一根用来界面跳转的线,都是一个UIStoryboardS...
    張贺阅读 1,644评论 0 5
  • 念奴娇 慢舍一周年贺词 星转斗移, 弹指间, 一年如诗如画。 慢舍迎来诞辰日, 多了各路益友。 海上劳工,...
    石三英语阅读 280评论 0 1
  • 六点起床,昨晚十二点入寝;六个小时雷打不动。其实,要养成11点入寝,五点起床的习惯也是完全可以做到的,关键在于自己...
    家童阅读 246评论 0 0