如果你还在苦恼block的传值和回调,不妨看看这个Demo,自己整理的,希望对大家有帮助,这是下载地址 https://github.com/ShaoWenLe/BlockTestByValueAndCall-back.git
用的是storyboard结合Xib,如果看着不习惯,可以从上面链接下载源码
//第一界面 // ViewController.h // BlockTestByValueAndCall-back // // Created by 出神入化 on 15/8/15. // Copyright (c) 2015年 出神入化. All rights reserved. // #import <UIKit/UIKit.h> @interface ViewController : UIViewController @property (weak, nonatomic) IBOutlet UILabel *label; @end // // ViewController.m // BlockTestByValueAndCall-back // // Created by 出神入化 on 15/8/15. // Copyright (c) 2015年 出神入化. All rights reserved. // #import "ViewController.h" #import "TwoViewController.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. _label.text = @"随便"; } - (IBAction)next:(id)sender { //用blockSelf修饰blockSelf.label 避免block块内部_label被循环引用 __weak ViewController *blockSelf = self; TwoViewController *twoVC = [[TwoViewController alloc] init]; //block返回值(跟代理写法挺类似的,就是语法不同,代理的话是此处是self.delegate=self;) [twoVC getValue:^(NSString *stringValue) { NSLog(@"打印block传的数值:%@",stringValue); blockSelf.label.text = stringValue; }]; [self.navigationController pushViewController:twoVC animated:YES]; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } @end //第二界面 // // TwoViewController.h // BlockTestByValueAndCall-back // // Created by 出神入化 on 15/8/15. // Copyright (c) 2015年 出神入化. All rights reserved. // #import <UIKit/UIKit.h> //重新定义block类名 void返回值类型 BlockValue类名(重命名类名) NSString *stringValue参数 typedef void(^BlockValue)(NSString *stringValue); @interface TwoViewController : UIViewController //block属性 此处要用copy修饰 @property (nonatomic, copy) BlockValue blockValue; @property (weak, nonatomic) IBOutlet UITextField *textField; - (void)getValue:(BlockValue)aBlock; @end // // TwoViewController.m // BlockTestByValueAndCall-back // // Created by 出神入化 on 15/8/15. // Copyright (c) 2015年 出神入化. All rights reserved. // #import "TwoViewController.h" #import "BlockDataHandle.h" @interface TwoViewController () @end @implementation TwoViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view from its nib. } - (void)getValue:(BlockValue)aBlock { self.blockValue = aBlock; } //回调button - (IBAction)callback:(id)sender { BlockDataHandle *blockdataHandle = [[BlockDataHandle alloc] init]; //回调blockdataHandle,传进去@"123",出来的string [blockdataHandle getData:@"123" block:^(NSString *string) { NSLog(@"打印回调之后的数据%@",string); }]; } //返回按钮 - (IBAction)back:(id)sender { //判断是否执行setBlock方法,然后再执行里面的操作 if (self.blockValue) { self.blockValue(_textField.text); } [self.navigationController popViewControllerAnimated:YES]; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } /* #pragma mark - Navigation // In a storyboard-based application, you will often want to do a little preparation before navigation - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { // Get the new view controller using [segue destinationViewController]. // Pass the selected object to the new view controller. } */ @end //回调数据处理类 // // blockData.h // BlockTestByValueAndCall-back // // Created by 出神入化 on 15/8/15. // Copyright (c) 2015年 出神入化. All rights reserved. // #import <Foundation/Foundation.h> typedef void(^BlockData)(NSString *string); @interface BlockDataHandle : NSObject @property (nonatomic, copy) BlockData blockData; //set方法 -(void)setBlockData:(BlockData)blockData; //传入参数NSString - (void)getData:(NSString *)string block:(BlockData)block; @end // // blockData.m // BlockTestByValueAndCall-back // // Created by 出神入化 on 15/8/15. // Copyright (c) 2015年 出神入化. All rights reserved. // #import "BlockDataHandle.h" @implementation BlockDataHandle -(void)setBlockData:(BlockData)blockData { _blockData = blockData; } - (void)getData:(NSString *)string block:(BlockData)block { NSString *str = [NSString stringWithFormat:@"ASDFGH%@", string]; //调用block block(str); } @end