导读
我们在进行程序编写时,往往需要在界面控制器跳转时传值.此处抛开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;
-希望对大家有所帮助-