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