天天看點

iOS開發常用之block傳值

原創未經允許,不得轉載

開發中會常用到傳值,正向傳值很簡單不必多說,那麼反向傳值就需要一提了,有block傳值,代理傳值等等。。今天咱們就來說說非常簡單實用的block傳值。。話不多說上代碼。

- (IBAction)Positioning:(id)sender {
    HSInstalltMapViewController * IMVC = [[HSInstalltMapViewController alloc] init];
    //先弱化self
    __weak __typeof(self)weakSelf = self;
    //block的實作
    IMVC.getCoordinate = ^(NSString * lat,NSString * lon){
        weakSelf.deviceCoordinate.text = [NSString stringWithFormat:@"%@,%@",lat,lon];

    };

    [self.navigationController pushViewController:IMVC animated:YES];
}           

注意,block的實作一定要是在控制器建立的時候。這個時候block裡面的代碼塊不會執行,等待block調用後再單獨執行。()裡面的是調用的時候傳過來的值,必須是類型和名稱組合,缺一不可,位置對應。拿到值就可以操作了,如何調用見下文。

@interface HSInstalltMapViewController : UIViewController
//block的申明
@property(nonatomic,copy)void(^getCoordinate)(NSString *,NSString*);           

這裡的申明要在.h檔案裡面,對外開放,blockd修飾詞必須是copy

void(^getCoordinate)(NSString *,NSString*)           

void意思是傳回值為空,一般情況下傳回值都是空,如果具有傳回值那麼可以添加,例如 NSArray (^getCoordinate)(NSString ,NSString*),前面的NSArry 不可加();(^getCoordinate)為block名稱,^為block符号,後面的就是名字,調用時用;(NSString ,NSString*)就是帶的參數了,這裡表示帶兩個字元串類型的參數。除了第一個傳回值不能加(),後面的名稱和參數都是必須加()。

最後一步就是調用了:

-(void)operationbtnclick{
    //block的調用
    self.getCoordinate(_latitude,_longitude);
    [self.navigationController popViewControllerAnimated:YES];
}           

這裡的調用沒什麼可多說,參數類型對應就可以了。與實作時的參數位置對應。

注意的是block在代碼中的執行順序

1.block前的代碼

{

2.block内部代碼

}

3block後的代碼

執行的時候就是先走1,然後走3,最後在調用block的時候再走2。是以如果是在block内部指派,在3使用,是不行的。應該将3也放入2中執行

block傳值就說到這裡 ,是不是很簡單?