本文只是写一下自己对与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");
...
}
只是一个简单的例子,还需要多看多写才能了解更多,加油撒。
网友评论