iOS:使用block进行类与类,控制器与控制器之间的传值

时间:2021-10-02 20:39:21

介绍:在iOS中类与类,控制器与控制器之间传值的方式有多种,分别是:单例传值、代理传值、通知传值、block传值或者一些偏好设置也可以用来传值。。。。

每一种传值方式都有各自的优点和缺点,针对不同情况选择符合需要的方式进行传值。这里我比较喜欢block方式传值,个人觉得简单好用,省却了不少代码。

下面简单给一个在控制器之间FirstViewController和SecondViewController使用block传值的例子:

在SecondViewController中:

SecondViewController.h文件

iOS:使用block进行类与类,控制器与控制器之间的传值

//
//  SecondViewController.h
//  block传值
//
//  Created by mac on 16/6/16.
//  Copyright © 2016年 JDYang. All rights reserved.
//

#import <UIKit/UIKit.h>

/**
 *  定义一个block别名,方便使用,该block返回值为void类型,有一个参数为字符串类型
 */
typedef void (^ReturnValueByBlock)(NSString *text);


@interface SecondViewController : UIViewController
/**
 *  声明一个block变量
 */
@property (copy,nonatomic)ReturnValueByBlock returnBlock;


/**
 *  声明一个实例方法,block代码块作为参数
 */
-(void)returnValue:(ReturnValueByBlock) block;
@end
iOS:使用block进行类与类,控制器与控制器之间的传值

SecondViewController.m文件

iOS:使用block进行类与类,控制器与控制器之间的传值

//
//  SecondViewController.m
//  block传值
//
//  Created by mac on 16/6/16.
//  Copyright © 2016年 JDYang. All rights reserved.
//

#import "SecondViewController.h"

@interface SecondViewController ()

@end

@implementation SecondViewController

- (void)viewDidLoad {
    [super viewDidLoad];
   
    //返回
    self.view.backgroundColor = [UIColor greenColor];
    self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCancel target:self action:@selector(back:)];
}

//返回
-(void)back:(UIBarButtonItem *)sender{
   
    [self.navigationController popViewControllerAnimated:YES];
   
    //给block参数赋值
    self.returnBlock(@"我是赛亚人!");
}

//通过实例方法回传值
-(void)returnValue:(ReturnValueByBlock)block{
    self.returnBlock = block;
}
@end
iOS:使用block进行类与类,控制器与控制器之间的传值

 

在FirstViewController中:

FirstViewController.m文件

iOS:使用block进行类与类,控制器与控制器之间的传值

//
//  ViewController.m
//  block传值
//
//  Created by mac on 16/6/16.
//  Copyright © 2016年 JDYang. All rights reserved.
//

#import "FirstViewController.h"
#import "SecondViewController.h"

@interface FirstViewController ()
@end

@implementation FirstViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    //创建按钮
    UIButton *btn = [[UIButton alloc]initWithFrame:CGRectMake(0, 0, 100, 100)];
    btn.center = self.view.center;
    btn.backgroundColor = [UIColor redColor];
    [btn setTitle:@"入栈" forState:UIControlStateNormal];
    [btn addTarget:self action:@selector(push:) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:btn];
}

//入栈
-(void)push:(UIButton *)sender{

    SecondViewController *secondVC = [[SecondViewController alloc]init];
    [self.navigationController pushViewController:secondVC animated:YES];
   
    //接收回传的值
    [secondVC returnValue:^(NSString *text) {
        NSLog(@"%@",text);
    }];
}
@end