iOS開發之控制器之間傳值

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