天天看点

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传值就说到这里 ,是不是很简单?