使用block从后往前传值
①在后面控制器的 .h文件 中声明block
// 一会要传的值为NSString类型
typedef void (^newBlock)(NSString *);
@interface NewViewController : UIViewController
// 声明block属性
@property (nonatomic, copy) newBlock block;
// 声明block方法
- (void)text:(newBlock)block;
@end
②在后面控制器的 .m文件 中设置block
// 设置block,设置要传的值
- (void)text:(newBlock)block
{
self.block = block;
}
- (void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:YES];
if (self.block != nil) {
self.block(@"呵呵");
}
}
③在前面控制器的 .m文件 中接收传来的值
#import "ViewController.h"
#import "NewViewController.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
UIButton *button = [UIButton buttonWithType:(UIButtonTypeRoundedRect)];
button.frame = CGRectMake(0, 100, 100, 100);
button.backgroundColor = [UIColor redColor];
[button addTarget:self action:@selector(push) forControlEvents:(UIControlEventTouchUpInside)];
[self.view addSubview:button];
}
- (void)push
{
NewViewController *newVC = [[NewViewController alloc] init];
// 接收block传来的值
newVC.block = ^(NSString *str){
NSLog(@"%@", str);
};
[self.navigationController pushViewController:newVC animated:YES];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
④最终实现效果:在控制台打印出了"呵呵"
到此,block完成传值
创建block匿名函数之前一般需要对self进行weak化,否则造成循环引用无法释放controller:
_weak typeof(self) weakSelf = self 或者 __weak MyController *weakSelf = self
网址:http://blog.csdn.net/zz_mm/article/details/46818575
#import "HomeViewController.h"
typedef int(^Blokc)(int) ; //Block是类型
@interface HomeViewController ()
@end
@implementation HomeViewController
- (void)viewDidLoad {
[superviewDidLoad];
// Do any additional setup after loading the view.
/*-------- 第一种 block的声明与创建 ----------*/
//声明一个block变量
/* int(^myBlock)(int); //返回值(^Block变量)(参数)
//创建block
myBlock = ^(int a){
NSLog(@"a = %d",a);
return 20;
}; //注意加分号
//调用block
int ret = myBlock(10);
NSLog(@"ret = %d",ret);
/*-------- 第二种 block的声明与创建 ----------*/
//声明一个block变量
/* Blokc mmBlock;
//创建block
mmBlock = ^(int b){
NSLog(@"b = %d",b);
b += b;
return b;
};
//调用block
int back = mmBlock(5);
NSLog(@"back = %d",back);
[self test:mmBlock];*/
/*-------- 第二种 block 引用局部变量 ----------*/
//直接定义的局部变量,在Block中当常量使用,不可改变其值
// int number = 20;
//局部变量需使用_block修饰,才能够在block块中使用
__block int number =20; //注意block前两个下划线
Blokc myblock2 = ^(int a) {
number = 30;
number++;
NSLog(@"number = %d",number);
return 10;
};
number = 40;
myblock2(30);
NSLog(@"number2 = %d",number);
}
//block作为参数声明,第一种
-(void)test:(int(^)(int))myBlock{
// 逻辑判断。。。。
//block回调
int new = myBlock(20);
NSLog(@"new = %d",new);
}
//block作为参数声明,第二种
-(void)testBlock:(Blokc)mmBlock{
}