多個界面之間的跳轉,免不了要進行數據傳遞,能夠是順向的,也能夠是逆向的。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(傳遞的數據); }