在上篇博客 《iOS Block簡介》 中,側重解析了 iOS Block的概念等,本文將側重於它們在開發中的應用。html
Block是iOS4.0+ 和Mac OS X 10.6+ 引進的對C語言的擴展,用來實現匿名函數的特性。
用維基百科的話來講,Block是Apple Inc.爲C、C++以及Objective-C添加的特性,使得這些語言能夠用類lambda表達式的語法來建立閉包。關於閉包,一句話解釋簡潔明瞭:閉包就是可以讀取其它函數內部變量的函數。閉包
在iOS開發中,Block有不少方面的用途,界面反向傳值就是其中之一。函數
假如咱們有一個需求以下:界面A上面有一個button、一個label。從界面A跳轉到界面B,在界面B的輸入框中輸入字符串,在界面A的label上顯示。這是一個典型的反向傳值的例子。這個例子的核心是:「在界面B的輸入框中輸入字符串,在界面A的label上顯示」。Block實現反向傳值。post
一、在第二個視圖控制器的.h文件中定義聲明Block屬性:atom
//定義block @property (nonatomic,copy) void (^NextViewControllerBlock)(NSString *tfText);
@interface NextViewController () @property (weak, nonatomic) IBOutlet UITextField *inputTF; @end - (IBAction)BtnAction:(id)sender { //判斷block是否爲空 if (self.NextViewControllerBlock) { self.NextViewControllerBlock(self.inputTF.text); } [self.navigationController popViewControllerAnimated:YES]; }
二、在第一個視圖中得到第二個視圖控制器,而且用第二個視圖控制器來調用定義的屬性:url
@interface AViewController () @property (weak, nonatomic) IBOutlet UILabel *nextVCInfoLabel; @end
- (IBAction)btnClicked:(id)sender { NextViewController *nextVC = [[NextViewController alloc]init]; nextVC.NextViewControllerBlock = ^(NSString *tfText){ self.nextVCInfoLabel.text = tfText; }; [self.navigationController pushViewController:nextVC animated:YES]; }
效果如圖:spa
因爲本文用的是XIB,省略了部分UI細節,附上本文的代碼連接:源碼。.net
哪裏寫的很差,望評論指點。謝過~code