多个界面之间的跳转,免不了要进行数据传递,能够是顺向的,也能够是逆向的。android中activity之间数据传递是用startActivity(Intent)和startActivityForResult方式,逆向的时候在源activity中重写onActivityResult方法,在这个方法中获取传递过来的数据。iOS中能够利用UIStoryboardSegue顺向或者用代理、block逆向进行值传递。android
1、Segue方式:ide
首先要知道Segue是什么,storyboard上每一条用来描述界面跳转的线,就是一个UIStoryboardSegue对象,简称Sugue。它有三个属性:atom
@property (nullable, nonatomic, copy, readonly) NSString *identifier;//segue的惟一标识 @property (nonatomic, readonly) __kindof UIViewController *sourceViewController;//源控制器 @property (nonatomic, readonly) __kindof UIViewController *destinationViewController;//目标控制器
根据Segue执行跳转的时刻,能够将其分为两种类型,自动和手动。自动类型是点击某个控件后,自动执行Segue完成界面跳转。手动类型是须要经过写代码来完成跳转。若是是手动类型,就须要给Segue设置一个identifier,而且在源控制器中执行这么一个方法:spa
[self performSegueWithIdentifier:@"identifier" sender:nil];
它内部的执行过程是这样的,建立segue->设置源控制器(segue.sourceViewController = self)->建立目的控制器,segue.destinationViewController = 目的控制器->[self prepareForSegue]跳转以前的准备操做->[segue perform]->判断下segue的类型,若是是push,拿到导航控制器push,[self.navigationController pushViewController:segue.destinationViewController animated:YES];代理
也就是说,在prepareForSegue方法中能够拿到目的控制器,天然就能够将数据传递到目的控制器了。这是顺向传递。code
逆向传递须要用代理的方式,A、B两个控制器,B在栈顶,如今B出栈要将数据传递给A,首先要在A跳转到B时让A成为B的代理,遵照代理协议,B在须要传数据的地方通知代理来处理时间并将数据扔给代理,意思就是B对A说这事我就交给你来作了,你要的东西我给你,你去作。这时候A实现代理协议中的方法,就拿到了B传过来的数据。orm
A控制器:对象
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { //A拿到B控制器,成为B的代理 BViewController *BVC = segue.destinationViewController; BVC.delegate = self; }
B控制器:
it
//在处理返回逻辑的方法中 //准备好要传递的数据 //通知代理 if ([_delegate respondsToSelector:@selector(代理方法)]) { [_delegate 代理方法(将数据当作参数)]; } //返回到A控制器 [self.navigationController popViewControllerAnimated:YES];
最后在A控制器中实现代理方法,就能获取到B传递的数据了。io
2、block方式:
如今B控制器中定义一个block属性
typedef 返回类型(^block别名)(参数); //别名通常是类名+Block @property(nonatomic, strong) block别名 block;
在A控制器中执行跳转的时候咱们拿到了B控制器,在B控制器的block属性中将要执行的操做代码先保存起来
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { BController *BVC = segue.destinationViewController; BVC.block = ^(参数){ //TODO:未来要进行的操做 //实际上这里的参数就是block传递过来的数据,咱们拿到这个参数就能够进行咱们想要作的事情了。逆向传参就完成了 }; }
当返回上一个控制器以前,要让block帮咱们完成某些事情
if (_block) { _block(传递的数据); }