block传值简介
在子页面中添加一个块语句属性,在子页面返回主页面之前调用该块语句。在主页面跳转子页面之前,设置子页面中的块语句属性将要执行的动作(回调函数)。这样,在子页面返回主页面时就会调用该回调函数来传递数据。
适用场景:已经通过push的方式进入到子页面,在从子页面返回主页面的时候(子页面会释放掉内存),需要在主页面中使用子页面中的数据,这是就可以利用代理反向传值。
传递方式:反向传递。
步骤:
步骤一:添加一个块语句属性
写在界面二(子页面)
//P1:block的重新命名
//P2:后面是要传的数据
typedef void (^TransDataBlock)(NSString* content);
@interface SecondViewController : UIViewController
@property (copy, nonatomic) TransDataBlock transDataBlock;
@end
步骤二:回传数据
写在界面二(子页面)
//如果回传block存在 则调用该block进行回传数据
if (self.transDataBlock) {
self.transDataBlock(_textField.text);
}
步骤三:设置对数据的处理
写在界面一(主页面)
KLSubViewController *subVC = [[KLSubViewController alloc] init];
//通过子页面的block回传拿到数据后进行处理,赋值给当前页面的textfield
subVC.transDataBlock = ^(NSString *content) {
self.textField.text = content;
};
完整代码:
//SecondViewController.h
#import <UIKit/UIKit.h>
typedef void (^TransDataBlock)(NSString* content);
@interface SecondViewController : UIViewController
@property (copy, nonatomic) TransDataBlock transDataBlock;
@end
//SecondViewController.m
#import "SecondViewController.h"
@interface SecondViewController ()
@property (strong, nonatomic) UITextField *textField;
@property (strong, nonatomic) UIButton *button;
@end
@implementation SecondViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
self.view.backgroundColor = [UIColor whiteColor];
self.title = @"子界面";
_textField = [[UITextField alloc] init];
_textField.textColor = [UIColor whiteColor];
_textField.textAlignment = NSTextAlignmentCenter;
_textField.backgroundColor = [UIColor blackColor];
_textField.frame = CGRectMake(100, 100, 200, 60);
[self.view addSubview:_textField];
_button = [UIButton buttonWithType:UIButtonTypeCustom];
[_button setTitle:@"跳转到主界面" forState:UIControlStateNormal];
[_button setTitleColor:[UIColor blueColor] forState:UIControlStateNormal];
[_button addTarget:self action:@selector(btnClicked:) forControlEvents:UIControlEventTouchUpInside];
_button.frame = CGRectMake(100, 300, 200, 60);
[self.view addSubview:_button];
}
- (void) btnClicked:(UIButton *)btn {
//如果回传block存在 则调用该block进行回传数据
if (self.transDataBlock) {
self.transDataBlock(_textField.text);
}
[self.navigationController popViewControllerAnimated:YES];
}
//FirstViewController.h
#import "FirstViewController.h"
#import "SecondViewController.h"
@interface FirstViewController ()
@property (strong, nonatomic) UITextField *textField;
@property (strong, nonatomic) UIButton *button;
@end
@implementation FirstViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
self.view.backgroundColor = [UIColor whiteColor];
self.title = @"主界面";
_textField = [[UITextField alloc] init];
_textField.textColor = [UIColor whiteColor];
_textField.textAlignment = NSTextAlignmentCenter;
_textField.backgroundColor = [UIColor blackColor];
_textField.frame = CGRectMake(100, 100, 200, 60);
[self.view addSubview:_textField];
_button = [UIButton buttonWithType:UIButtonTypeCustom];
[_button setTitle:@"跳转到子界面" forState:UIControlStateNormal];
[_button setTitleColor:[UIColor blueColor] forState:UIControlStateNormal];
[_button addTarget:self action:@selector(btnClicked:) forControlEvents:UIControlEventTouchUpInside];
_button.frame = CGRectMake(100, 300, 200, 60);
[self.view addSubview:_button];
}
- (void) btnClicked:(UIButton *)btn {
SecondViewController *subVC = [[SecondViewController alloc] init];
//通过子页面的block回传拿到数据后进行处理,赋值给当前页面的textfield
subVC.transDataBlock = ^(NSString* content) {
self.textField.text = content;
};
[self.navigationController pushViewController:subVC animated:YES];
}
效果