iOS開發中不想用delegate協議方法怎麼辦?那就用block!
前兩天在網上看到大神將 alertView 的 delegate 協議方法轉為 block 實現,實在是大快我心(其實一開始我就不喜歡 delegate 的,偏向 block,現在也在 block 學習路上)
先展示一下使用
UIAlertView *customAlertView = [[UIAlertView alloc] initWithTitle:title message:message delegate:self cancelButtonTitle:@"取消"otherButtonTitles:@"確定",nil];
[customAlertView showAlertViewWithCompleteBlock::^(UIAlertView*alertView,NSInteger buttonIndex) {
// code
}];
複製程式碼
這樣 alert 的 delegate 就不用去寫了,是不是很方便?!
這個 UIAlertView+Block 實現方式是利用 runtime 來實現,在系統呼叫 alert 的 delegate 時,將其轉化為 block,程式碼很簡單,能想出來,卻不簡單,謝謝這位大神,程式碼貼出來(詳細註釋)
新建 AlertView 的分類 UIAlertView+Block
// .h 檔案
// 先定義一個 block結果回撥
typedef void(^CompleteBlock) (UIAlertView *alertView, NSInteger buttonIndex);
@interfaceUIAlertView (Block)
// 顯示alertView
- (void)showAlertViewWithCompleteBlock:(CompleteBlock)block;
@end
複製程式碼
// .m 檔案
#import "UIAlertView+Block.h"
@implementation UIAlertView (Block)
static char key;
-(void)showAlertViewWithCompleteBlock:(CompleteBlock)block {
// 首先判斷這個block是否存在
if(block) {
// 這裡用到了runtime中繫結物件,將這個block物件繫結alertview上
objc_setAssociatedObject(self, &key,block,OBJC_ASSOCIATION_COPY);
//設定delegate
self.delegate=self;
}
//彈出提示框
[selfshow];
}
- (void)alertView:(UIAlertView*)alertView clickedButtonAtIndex:(NSInteger)btnIndex {
//拿到之前繫結的block物件
CompleteBlockblock = objc_getAssociatedObject(self, &key);
//移除所有關聯
objc_removeAssociatedObjects(self);
if (block) {
//呼叫block傳入此時點選的按鈕index
block(alertView, btnIndex);
}
}
@end
複製程式碼