iOS传值一共有四种:属性传值,代理传值,通知传值以及Block传值;
今天我们来说一下Block传值:
概念:带有自动变量的匿名函数
语法:
“^”这个符号表示这是一个Block
Block中不可以对C语言数组进行操作
用途:
传值
模式
无参数无返回值的Block
无参数有返回值的Block
有参数无返回值的Block
有参数有返回值的Block
block的代码是内联的,效率高于函数调用
block对于外部变量默认是只读属性
block被Objective-C看成是对象处理
(1)在类中,定义一个Block变量,就像定义一个函数;
(2)Block可以定义在方法内部,也可以定义在方法外部;
(3)只有调用Block时候,才会执行其{}体内的代码;
下面就直奔主题吧---传值
1、传值方
//.h 文件/**
* 类型自定义
*/typedefvoid(^ReturnValueBlock) (NSString*strValue);@interfaceNextViewController:UIViewController/**
* 声明一个ReturnValueBlock属性,这个Block是获取传值的界面传进来的
*/@property(nonatomic,copy) ReturnValueBlock returnValueBlock;
@end
=================================================================
//.m 文件
#import"NextViewController.h"
@interfaceNextViewController()
@property(weak,nonatomic)IBOutletUITextField*inputText;
- (IBAction)back:(id)sender;
@end
@implementationNextViewController
- (void)viewDidLoad {
[superviewDidLoad];
self.navigationItem.title =@"第二个界面";
}
/**
* 返回上一个界面
*
* @param sender 按钮
*/
- (IBAction)back:(id)sender {
NSString*inputString =self.inputText.text;
if(self.returnValueBlock) {
//将自己的值传出去,完成传值
self.returnValueBlock(inputString);
}
[self.navigationController popViewControllerAnimated:YES];
}
@end
2、捕获方
//.m 文件#import"ViewController.h"
#import"NextViewController.h"
@interfaceViewController()
@property(weak,nonatomic)IBOutletUILabel*nextPassedValue;
- (IBAction)next:(id)sender;@end
@implementationViewController
- (void)viewDidLoad {
[superviewDidLoad];}
//点击按钮跳转到第二个界面
- (IBAction)next:(id)sender
{ NextViewController *nvc = [[NextViewController alloc]init];
//赋值Block,并将捕获的值赋值给
UILabelnvc.returnValueBlock = ^(NSString*passedValue){self.nextPassedValue.text = passedValue; };
[self.navigationController pushViewController:nvc animated:YES];
}@end