首先先說下我的意思:子控件有個按鈕點擊的block回調(diào),但是我封裝出來,只是想用父控件的block就能實現(xiàn)那個按鈕的點擊事件,而并不關(guān)心子控件。就如下圖不用寫注釋那樣的代碼也能實現(xiàn)按鈕的點擊事件。

我最開始的想法:是block是一個屬性,所以我就進行賦值,將父控件的block賦值給子控件的block??墒遣荒艹晒?,就算是將子控件的block賦值給父控件的block也不能成功,都是在那個按鈕點擊的時候,block就已經(jīng)為空了。


最后的想法:既然上面那種方法行不通,我就只能考慮別的方式了,最后想到了,可以進行block方法的傳遞,然后果然就成功了,就如下:
- (LCFarmerBankAlertSubView *)subView {
if (!_subView) {
_subView = [LCFarmerBankAlertSubView farmerBankAlertSubView];
__block LCFarmerBankAlertView *weakSelf = self;
_subView.openButtonClickedBlock = ^{
if (weakSelf.openButtonClickedBlock) {
weakSelf.openButtonClickedBlock();
}
};
}
return _subView;
}
在這里面實現(xiàn)子控件的block,并且再在子控件block的回調(diào)中實現(xiàn)父控件的block方法。這樣直接調(diào)用父控件的block,也能實現(xiàn)子控件的按鈕點擊事件了。
這算非常簡單的問題了,只是當(dāng)時很困惑,所以記錄一下,看客勿怪,有更好的方法建議,還望傳授。
補充:
原來那種賦值的方法,可以傳遞block,只不過我是在initWithFrame方法里面進行賦值的,可是那個時候父控件的block還沒有值,所以才會失敗,然后只要將賦值寫在父控件block的setter方法里面就可以了
- (void)setOpenButtonClickedBlock:(OpenButtonClickedBlock)openButtonClickedBlock {
_openButtonClickedBlock = openButtonClickedBlock;
self.subView.openButtonClickedBlock = self.openButtonClickedBlock;
}
還有就是測試的時候發(fā)現(xiàn):
1 __block并不能解決循環(huán)引用的問題,還是必須要用__weak。
2 當(dāng)移除子控件的時候,如果子控件是設(shè)置的為控制器的屬性,還需要將子控件設(shè)置為nil,才會調(diào)用子控件的delloc方法,因為它被控制器和父控件兩個強引用
[self.navigationController.view addSubview:self.alertView];
[self.navigationController.view bringSubviewToFront:self.alertView];
__weak LCAccountViewController *weakSelf = self;
self.alertView.openButtonClickedBlock = ^{
[weakSelf.alertView removeFromSuperview];
weakSelf.alertView = nil;
};
總結(jié):你認為的錯的方式的時候,有時候只是你沒有多思考,沒有找到錯誤的原因和正確的方式,遇到事情還是要多思考。