介绍:在iOS中类与类,控制器与控制器之间传值的方式有多种,分别是:单例传值、代理传值、通知传值、block传值或者一些偏好设置也可以用来传值。。。。
每一种传值方式都有各自的优点和缺点,针对不同情况选择符合需要的方式进行传值。这里我比较喜欢block方式传值,个人觉得简单好用,省却了不少代码。
下面简单给一个在控制器之间FirstViewController和SecondViewController使用block传值的例子:
在SecondViewController中:
SecondViewController.h文件
// // SecondViewController.h // block传值 // // Created by mac on 16/3/16. // Copyright © 2016年 mac. 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
SecondViewController.m文件
// // SecondViewController.m // block传值 // // Created by mac on 16/3/16. // Copyright © 2016年 mac. 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
在FirstViewController中:
FirstViewController.m文件
// // ViewController.m // block传值 // // Created by mac on 16/3/16. // Copyright © 2016年 mac. 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
每次返回时打印结果:
2016-03-16 20:41:45.762 block传值[6511:271329] 我是中国人!