【iOS开发】——block传值

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];
}

效果

请添加图片描述
请添加图片描述

猜你喜欢

转载自blog.csdn.net/weixin_50990189/article/details/119376968