iOS4.0開始,Block橫空出世,它其實就是c預言的補充,書面點說就是帶有自動變數的匿名函數,Block簡潔,代碼的可讀性也高,因此深受廣大開發者的喜愛,這一次給大家介紹Block的基本類型和項目中的實際操作。 Block的形式如下: Block的基本類型 1.無參數無返回值 2.無參數有返回值 ...
iOS4.0開始,Block橫空出世,它其實就是c預言的補充,書面點說就是帶有自動變數的匿名函數,Block簡潔,代碼的可讀性也高,因此深受廣大開發者的喜愛,這一次給大家介紹Block的基本類型和項目中的實際操作。
Block的形式如下:
Block的基本類型
1.無參數無返回值
void(^tempBlock)() = ^(){ NSLog(@"無參無返回值"); }; //調用 tempBlock();
2.無參數有返回值
int(^tempBlock)() = ^(){ return 10; }; //調用的時候,無論你輸入的是什麼都返回的是10; tempBlock(100);
3.有參數無返回值
void(^tempBlock)(int) = ^(int temp){ NSLog(@"有參數無返回值"); };
4.有參數有返回值
int(^tempBlock)(int) = ^(int number){ return number; }; //輸入多少列印就是多少 tempBlock(100);
Block的經典實用場景
1.修改外部變數
__block int x = 100; void(^sumXWithYBlock)(int) = ^(int y){ x = x + y; NSLog(@"new value %d",x); }; //列印的值就是x+y,100+100=200 sumXWithYBlock(100);
2.頁面間的傳值
//1.在第二個頁面(SecondViewController)首先聲明一個屬性 /** 先聲明block的名字,並確定參數的類型 */ @property(nonatomic,copy)void (^netViewBlock)(NSString *text); //2.在點擊按鈕返回的時候,往回傳你需要傳的參數,參數類型要一致 -(void)back{ self.netViewBlock(@"你好"); [self.navigationController popViewControllerAnimated:YES]; }
3.在第一頁(FirstViewController),準備push進入下一頁的時候,獲取ViewController2的屬性,並實現。
-(void)click:(UIButton *)sender{ //把第二頁的返回的值顯示在label上 UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(30, 100, 200, 30)]; [self.view addSubview:label]; SecViewController *vc = [[SecViewController alloc] init]; vc.netViewBlock = ^(NSString *text){ label.text = text; }; [self.navigationController pushViewController:vc animated:YES]; }
自定義Block
例子:點擊Button,需要改變Button的title
實現:
1.創建一個工具類,聲明一個類方法,並自定義一個block,需要傳title,所以傳參類型是NSString
@interface ChangeBuTitleTool : NSObject +(void)changeBuTitleWithText:(void(^)(NSString *titleText))text; @end
2.實現
@implementation ChangeBuTitleTool +(void)changeBuTitleWithText:(void(^)(NSString *titleText))text{ if (text) { text(@"tyler"); } } @end
3.在控制器里Button的點擊的時候,實現改變title的方法
-(void)addButton{ UIButton *bu = [UIButton buttonWithType:(UIButtonTypeCustom)]; bu.backgroundColor = [UIColor blueColor]; bu.frame = CGRectMake(30, 90, 100, 50); [self.view addSubview:bu]; [bu addTarget:self action:@selector(click:) forControlEvents:(UIControlEventTouchUpInside)]; } -(void)click:(UIButton *)sender{ [ChangeBuTitleTool changeBuTitleWithText:^(NSString *titleText) { [sender setTitle:titleText forState:(UIControlStateNormal)]; }]; }
4.Block與typedef的結合
在上一個例子中,聲明一個類方法,其中定義block直接寫在類方法里,看起來很不和諧,尤其是對新手看起來可讀性不太高,可以用typedef單獨定義一個block,增加代碼的可讀性。
typedef void (^titleBlock)(NSString *titleText); @interface ChangeBuTitleTool : NSObject +(void)changeBuTitleWithText:(titleBlock)text; //+(void)changeBuTitleWithText:(void(^)(NSString *titleText))text; @end @implementation ChangeBuTitleTool +(void)changeBuTitleWithText:(titleBlock)text{ if (text) { text(@"tyler"); } } @end
Block入門篇就介紹到這裡,下期更精彩!<( ̄︶ ̄)>