iOS传值-block 回调

说明:本文是在了解block基础知识基础上的应用,假定阅读者已经具备block基础知识。

目的:通过block回调方式将SecondViewController中的值传入到ViewController中,在某些时候,通过block回调,可以避免delegate的繁琐

1,新建Single View Application工程,新建SecondViewController

2,在ViewController中添加UILabel用于显示SecondViewController传过来的值,把label设置为成员变量,添加一个UIButton,用于点击跳转到SecondViewController

@interface ViewController (){
    UILabel *_label;
}

@end

- (void)viewDidLoad {
    [super viewDidLoad];
    //添加UIButton,用于跳转到SecondViewController
    UIButton *btn = [[UIButton alloc] initWithFrame:CGRectMake(20, 200, 300, 44)];
    [btn setTitle:@"ToSecondViewController" forState:UIControlStateNormal];
    btn.backgroundColor = [UIColor grayColor];
    [btn addTarget:self action:@selector(toSecondViewController) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:btn];
    
    //添加UILabel,用于显示SecondViewController传过来的值
    _label = [[UILabel alloc] initWithFrame:CGRectMake(20, 100, 300, 44)];
    _label.backgroundColor = [UIColor yellowColor];
    [self.view addSubview:_label];


}

 

3,在SecondViewController.m中添加一个UITextField,设置为成员变量,用于输入值,添加一个UIButton,用于点击跳转回ViewController

@interface SecondViewController (){
    UITextField *_textField;
}

@end
- (void)viewDidLoad {
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor whiteColor];
    //添加一个按钮用于返回ViewController
    UIButton *btn = [[UIButton alloc] initWithFrame:CGRectMake(20, 200, 300, 44)];
    [btn setTitle:@"BackToViewController" forState:UIControlStateNormal];
    btn.backgroundColor = [UIColor blueColor];
    [btn addTarget:self action:@selector(backToViewController) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:btn];
    
    //添加一个UITextField
    _textField = [[UITextField alloc] initWithFrame:CGRectMake(20, 100, 300, 44)];
    _textField.backgroundColor = [UIColor greenColor];
    [self.view addSubview:_textField];
}

4,在SecondViewController.h中,利用typedef定义一个block,并设置成property,同时声明一个回调方法

#import <UIKit/UIKit.h>

//定义一个block
typedef void (^ReturnValueBlock)(NSString *value);

@interface SecondViewController : UIViewController

@property (nonatomic,copy)ReturnValueBlock returnValueBlock;

//回调方法
- (void)returnValue:(ReturnValueBlock)block;


@end

5,实现回调方法,并且在点击返回ViewController按钮时调用

- (void)backToViewController {
    //当点击返回ViewController时回调
    if (self.returnValueBlock != nil) {
        self.returnValueBlock(_textField.text);
    }
    
    [self dismissViewControllerAnimated:YES completion:nil];
}

- (void)returnValue:(ReturnValueBlock)block {
    self.returnValueBlock = block;
}

6,在ViewController.m中使用block方法为label赋值

- (void)toSecondViewController {
    SecondViewController *second = [[SecondViewController alloc] init];
    [second returnValue:^(NSString *value) {
        _label.text = value;
    }];

    [self presentViewController:second animated:YES completion:nil];
}

源码地址:https://github.com/rokistar/PassValueUsingBlock

posted on 2015-06-07 16:27  Roki  阅读(347)  评论(0编辑  收藏  举报

导航