使用場景:點擊自定義cell中的一個按鈕歼捐,跳轉(zhuǎn)至其他控制器
碰到這樣的需求肯定第一想到的是使用delegate,接下來使用 block實現(xiàn)跳轉(zhuǎn)
缔御,至于block怎么定義钥弯,用什么關(guān)鍵字修飾,為什么要用copy請移步簡書的其他文章休讳,謝謝!
testCell.h 定義一個帶參數(shù)的block
#import <UIKit/UIKit.h>
typedef void (^myblock)(id parameter);
@interface testCell : UITableViewCell
/**
* 創(chuàng)建自定義的cell
*/
+(instancetype)cellWithTableView:(UITableView*)tableView;
/**
* 定義block
*/
@property (nonatomic, copy) myblock testBlock;
@end````
## testCell.m 在按鈕點擊事件中調(diào)用block
-
(IBAction)didClickme:(id)sender {
if (self.testBlock) {
self.testBlock(@"點擊了我");
}
}```
控制器中實現(xiàn)跳轉(zhuǎn)
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
testCell *cell = [testCell cellWithTableView:tableView];
cell.testBlock = ^(NSString *log){
NSLog(@"log = %@", log);
};
return cell;
}```
## 結(jié)論:程序運行之后,點擊cell上的按鈕尿孔,`就能輸出log信息點擊了我`
看似很完美的東西俊柔,其實里面包好各種細節(jié)問題筹麸,如果沒有弄清楚他的本質(zhì),可能以后在項目使用過程中會引發(fā)各種問題雏婶,說不定就崩潰物赶,或者block不執(zhí)行!接下來說說我的理解尚骄,****特別注意這是我個人的理解块差,說不定哪個大神看到了侵续,會噴飯倔丈,希望有什么不對的地方,提出來状蜗,我會及時修改需五,以免誤導(dǎo)別人****
問題:
### 1.為什么我在testCell.m調(diào)用block的時候,要`加一個判斷`轧坎,不這樣寫行不行宏邮?
### 2.為什么我一`點擊按鈕`,控制器里給block賦值的代碼`立馬就能反映`缸血?
我開始在思考的時候蜜氨,立馬就想到了通知,感覺跟通知很相似捎泻,通知的使用飒炎,就是先注冊,然后發(fā)送通知笆豁,通知一發(fā)送立馬就能收到信息郎汪,想想block內(nèi)部的機制,或許就是使用通知闯狱,kvo來實現(xiàn)的煞赢,后來查閱資料,并不是那么一回事照筑。
首先來看看block的定義
`typedef void (^myblock)(id parameter);`熟悉c語言的童鞋,`一看就明白凝危,這不跟c語言的函數(shù)很像嗎?`
void block(NSString *log)
{
};```
這就好理解了媒抠,其實在控制器里面的賦值代碼,其實就是一個變量保存了一個c語言的函數(shù)
咏花,相當于cell.testBlock對象趴生,聲明實現(xiàn)了一個方法
阀趴,
cell.testBlock = ^(NSString *log){
NSLog(@"log = %@", log);
};
此時點擊cell中的按鈕苍匆,調(diào)用block其實就是調(diào)用了之前早就在控制器初始化的時候,賦值的c函數(shù)浸踩,self.testBlock(@"點擊了我")
這一句代碼不就是c語言中調(diào)用方法嘛叔汁,這樣就能解釋問題2了
。
- (IBAction)didClickme:(id)sender {
if (self.testBlock) {
self.testBlock(@"點擊了我");
}
}```
想必問題1也不需要我多解釋了吧检碗,有一個小插曲据块,前不久我在GitHub上下載了一個別人寫的第三方框架,`這個框架外面提供了一個block定義的屬性另假,返回的是一個字符串`怕犁。當我把這個框架拖到我們項目中边篮,然后在某個地方使用的時候奏甫,立刻就奔潰了,它的demo是沒有問題的阵子,`當時就很納悶了,后面我是在它的框架中改了一行`代碼款筑,說到這大家應(yīng)該清楚是什么代碼了吧,對杈湾,就是在調(diào)用block的時候,加了一個判斷漆撞,`就是為了防止崩潰`于宙,你外部都沒有給我賦值,創(chuàng)建c語言函數(shù)捞魁,我去哪里調(diào)用你的函數(shù),這就是問題1.