iOS傳值一共有四種:屬性傳值,代理傳值,通知傳值以及Block傳值;
今天我們來說一下Block傳值:
概念:帶有自動(dòng)變量的匿名函數(shù)
語法:
“^”這個(gè)符號表示這是一個(gè)Block
Block中不可以對C語言數(shù)組進(jìn)行操作
用途:
傳值
模式
無參數(shù)無返回值的Block
無參數(shù)有返回值的Block
有參數(shù)無返回值的Block
有參數(shù)有返回值的Block
block的代碼是內(nèi)聯(lián)的又固,效率高于函數(shù)調(diào)用
block對于外部變量默認(rèn)是只讀屬性
block被Objective-C看成是對象處理
(1)在類中胖腾,定義一個(gè)Block變量但荤,就像定義一個(gè)函數(shù)锌云;
(2)Block可以定義在方法內(nèi)部,也可以定義在方法外部;
(3)只有調(diào)用Block時(shí)候,才會(huì)執(zhí)行其{}體內(nèi)的代碼;
下面就直奔主題吧---傳值
1规阀、傳值方
//.h 文件/**
*? 類型自定義
*/typedefvoid(^ReturnValueBlock) (NSString*strValue);@interfaceNextViewController:UIViewController/**
*? 聲明一個(gè)ReturnValueBlock屬性,這個(gè)Block是獲取傳值的界面?zhèn)鬟M(jìn)來的
*/@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 =@"第二個(gè)界面";
}
/**
*? 返回上一個(gè)界面
*
*? @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];}
//點(diǎn)擊按鈕跳轉(zhuǎn)到第二個(gè)界面
- (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