Block之我贱

2016-06-06  本文已影响11人  Rokkia

本文只是写一下自己对与block的一些理解,不对的地方也请留言纠正.

文章根据https://onevcat.com/2011/11/objc-block/

根据网上的说明,block本质就是一段代码块,只是这个代码kuai可以获取到他所在的代码块里的其他变量,比如

-(void) printStr{

NSString *str = @"123";

//创建一个block变量

void(^block)(NSString *inputStr) = ^(NSString *inputStr)

    {

        NSLog(inputStr);

    }

//问题来了,创建了怎么使用,方法很简单 如下

block(str);

}

虽然block的声明看起来比较奇怪,但是习惯就好了(只能这样安慰自己)

还好苹果为我们提供了另外一种声明方式  typedef ....

改写上面方法

typedef void(^Block)(NSString *inputStr) ;

-(void) printStr{

NSString *str = @"123";

//创建一个block变量

Block block = ^(NSString *inputStr)

{

NSLog(inputStr);

}

//问题来了你创建了怎么使用,方法很简单 如下

block(str);

}

仔细一看貌似没有改变多少,但是用多了就会发现大有不同

为了半天劲就为了打印一个Str,何必这样大费周章,通过看大神的文章,关于block大家貌似离不开回调这个词,用一个界面反向传值来解释一下,简单的firstViewController跳转到secondViewController,在跳转回firstViewController时,打印在第二界面传回的Str

第一步简单跳转

firstViewController.m和secondViewController.m

- (void)viewDidLoad {

[superviewDidLoad];

UIButton*button = [UIButtonbuttonWithType:UIButtonTypeCustom];

button.frame=CGRectMake(100,100,150,50);

[self.viewaddSubview:button];

button.backgroundColor= [UIColororangeColor];

[buttonaddTarget:selfaction:@selector(buttonClick:)forControlEvents:UIControlEventTouchUpInside];

}

-(void)buttonClick:(UIButton*)sender{

SecondViewController*secondController = [[SecondViewControlleralloc]init];

[selfpresentViewController:secondControlleranimated:YEScompletion:nil];

}

secondViewController中

- (void)viewDidLoad {

[superviewDidLoad];

self.view.backgroundColor= [UIColorwhiteColor];

UIButton*button = [UIButtonbuttonWithType:UIButtonTypeCustom];

button.frame=CGRectMake(100,100,150,50);

[self.viewaddSubview:button];

button.backgroundColor= [UIColororangeColor];

[buttonaddTarget:selfaction:@selector(buttonClick:)forControlEvents:UIControlEventTouchUpInside];

}

-(void)buttonClick:(UIButton*)sender{

self.backStrBlock(@"123");

[selfdismissViewControllerAnimated:YEScompletion:nil];

}

简单的实现跳转返回

第二步 在secondViewController里面添加block

secondViewController.h

typedefvoid(^BackStrBlock)(NSString*backStr);

@interfaceSecondViewController :UIViewController

-(void)setBlock:(BackStrBlock)backBlock;

@end

第三步实现添加block属性+实现.h中的方法

@interfaceSecondViewController()

@property(nonatomic,assign)BackStrBlockbackStrBlock;

@end

-(void)setBlock:(BackStrBlock)backBlock{

self.backStrBlock= backBlock;

}

第四步在firstViewController实现跳转时调用setBlock方法

-(void)buttonClick:(UIButton*)sender{

...

BackStrBlock backBlock = ^(NSString*inputStr){

    NSLog(@"%@",inputStr);

};

[secondControllersetBlock:backBlock];

...

}

第五步在secondViewController里面恰当的时机执行block

-(void)buttonClick:(UIButton*)sender{

self.backStrBlock(@"123");

...

}

只是一个简单的例子,还需要多看多写才能了解更多,加油撒。

上一篇下一篇

猜你喜欢

热点阅读