iOS開發中不想用delegate協議方法怎麼辦?

溫特兒發表於2019-03-16

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
複製程式碼

相關文章