iOS封裝UIAlertView的delegate回調(diào)方式為Block

<b><center>將iOS系統(tǒng)UIAlertView的UIAlertViewDelegate改為Block的方式實現(xiàn)<center></b>

相信很多iOS的開發(fā)者在開發(fā)中都有過這樣的情況芬位,某個需求需要彈出框提示弃酌,然后點擊提示框的確定或取消就需要跳轉(zhuǎn)頁面或者實現(xiàn)相應(yīng)業(yè)務(wù)邏輯仆百。這個時候罗心,我遇到大多coder是像下面這樣做的:

@interface ViewController ()<UIAlertViewDelegate>

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"提示" message:@"確定刪除嗎?" delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"確定", nil];
    [alert show];
}

#pragma mark - UIAlertViewDelegate
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{
#warning TODO...
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end

這樣强重,可以礼旅,完美的實現(xiàn)了需求。雖然滿足了需求俐东,但是跌穗,一個成熟的軟件,會隨著客戶的需求而不斷調(diào)整代碼虏辫,會有不同的coder來維護和擴展蚌吸。當需求是,根據(jù)server返回的一個flag值或者什么type的值來判斷點擊了確定按鈕之后的業(yè)務(wù)邏輯砌庄,這個時候羹唠,這種方式可能就不是很適合了。通常娄昆,最初級的coder可能會在接收到flag的時候?qū)懚鄠€if判斷佩微,或者switch,然后進行多個彈框萌焰,或者為alert加個tag哺眯,在引入頭文件處聲明幾個宏#define kFlagA 100 #define kFlagB 101 把這些宏給alert的tag,最后在UIAlertViewDelegate里面根據(jù)tag值來做相應(yīng)的邏輯代碼扒俯。寫完之后測試一把奶卓,還不錯,完美撼玄。過了n久夺姑,公司招了一個人來二次開發(fā),改的改需求掌猛,然后看到了這里瑟幕,先是找彈出框show的地方,然后還去理解定義的宏,看了半天只盹,才搞明白對應(yīng)的aflag該做什么辣往,bflag又是個怎么回事的情況下才會執(zhí)行... , 通常的coder是不會去改這些方法的殖卑,如果是我看到站削,我會毫不猶豫的花幾分鐘的時間把這樣的代碼給替換掉的。 說這些孵稽,都是廢話许起。相信真正有這樣體驗過的coder一定都深有體會。下面就貼出我之前封裝的一個UIAlertView,實現(xiàn)了只點擊確定的block回調(diào)菩鲜,只點擊取消的block回調(diào)园细,以及兩個點擊都通過block回調(diào),希望對初學(xué)iOS者以及理解block接校、還不知道這種方式的iOSer有所幫助猛频。

CHAlertView.h

#import <UIKit/UIKit.h>

/**
*  @brief 點擊回調(diào)
*
*  @param index 點擊的下標
*/
typedef void (^CHAlertViewClickedWithIndex)(NSInteger index);
/**
*  @brief 點擊確定按鈕回調(diào)
*/
typedef void (^CHAlertViewOkClicked)();
/**
*  @brief 點擊取消按鈕回調(diào)
*/
typedef void (^CHAlertViewCancelClicked)();

/**
*  @brief 彈出框
*/
@interface CHAlertView : NSObject
/**
*  @brief 彈出提示框,點擊返回點擊下標
*
*  @param title           標題
*  @param msg             提示信息
*  @param cancelTitle     取消按鈕文字
*  @param okTitle         確定按鈕文字
*  @param otherTitleArray 其他按鈕文字
*  @param handle          點擊回調(diào)
*/
+ (void)showCHAlertViewWithTitle:(NSString *)title message:(NSString *)msg cancleButtonTitle:(NSString *)cancelTitle okButtonTitle:(NSString *)okTitle otherButtonTitleArray:(NSArray*)otherTitleArray clickHandle:(CHAlertViewClickedWithIndex) handle;
/**
*  @brief 彈出提示框只有確定和取消按鈕
*
*  @param title             標題
*  @param msg               提示信息
*  @param cancelTitle       取消按鈕文字
*  @param okTitle           確定按鈕文字
*  @param okHandle          點擊確定回調(diào)
*  @param cancelClickHandle 點擊取消回調(diào)
*/
+ (void)showCHAlertViewWithTitle:(NSString *)title message:(NSString *)msg cancleButtonTitle:(NSString *)cancelTitle okButtonTitle:(NSString *)okTitle okClickHandle:(CHAlertViewOkClicked)okHandle cancelClickHandle:(CHAlertViewCancelClicked)cancelClickHandle;
/**
*  @brief 彈出框蛛勉,沒有回調(diào).
*
*  @param title           標題
*  @param msg             提示信息
*  @param cancelTitle     取消按鈕的文字
*  @param okTitle         確定按鈕的文字
*  @param otherTitleArray 其他按鈕文字
*/
+ (void)showCHAlertViewWithTitle:(NSString *)title message:(NSString *)msg cancleButtonTitle:(NSString *)cancelTitle okButtonTitle:(NSString *)okTitle otherButtonTitleArray:(NSArray*)otherTitleArray;

@end

CHAlertView.m (實現(xiàn)文件里面方法都沒有寫注釋鹿寻,為什么?因為頭文件里面已經(jīng)寫的很詳細了诽凌。)

#import "CHAlertView.h"
#import <objc/runtime.h>

const char *KCHAlertViewIndexBlock = "CHAlertViewIndexBlock";
const char *KCHAlertViewOkBlock = "CHAlertViewOkBlock";
const char *KCHAlertViewCancelBlock = "CHAlertViewCancelBlock";

@interface UIAlertView(CHAlertView)

@property (nonatomic,copy)CHAlertViewClickedWithIndex indexBlock;
@property (nonatomic,copy)CHAlertViewOkClicked okBlock;          
@property (nonatomic,copy)CHAlertViewCancelClicked cancelBlock;  

@end

@implementation UIAlertView(CHAlertView)

- (void)setIndexBlock:(CHAlertViewClickedWithIndex)indexBlock{
    objc_setAssociatedObject(self, KCHAlertViewIndexBlock, indexBlock, OBJC_ASSOCIATION_COPY);
}
- (CHAlertViewClickedWithIndex)indexBlock{
    return objc_getAssociatedObject(self, KCHAlertViewIndexBlock);
}

- (void)setOkBlock:(CHAlertViewOkClicked)okBlock{
    objc_setAssociatedObject(self, KCHAlertViewOkBlock, okBlock, OBJC_ASSOCIATION_COPY);
}
- (CHAlertViewOkClicked)okBlock{
    return objc_getAssociatedObject(self, KCHAlertViewOkBlock);
}

- (void)setCancelBlock:(CHAlertViewCancelClicked)cancelBlock{
    objc_setAssociatedObject(self, KCHAlertViewCancelBlock, cancelBlock, OBJC_ASSOCIATION_COPY);
}
-(CHAlertViewCancelClicked)cancelBlock{
    return objc_getAssociatedObject(self, KCHAlertViewCancelBlock);
}

@end

@interface CHAlertView ()<UIAlertViewDelegate>

@end

@implementation CHAlertView

#pragma mark -
+ (void)showCHAlertViewWithTitle:(NSString *)title message:(NSString *)msg cancleButtonTitle:(NSString *)cancelTitle okButtonTitle:(NSString *)okTitle otherButtonTitleArray:(NSArray*)otherTitleArray clickHandle:(CHAlertViewClickedWithIndex) handle{
    UIAlertView  *alert = [[UIAlertView alloc] initWithTitle:title message:msg delegate:handle ? self : nil cancelButtonTitle:cancelTitle otherButtonTitles:okTitle, nil];
    if (handle) {
        alert.indexBlock = handle;
    }
    for (NSString *otherTitle in otherTitleArray) {
        [alert addButtonWithTitle:otherTitle];
    }
    [alert show];
}

#pragma mark -
+ (void)showCHAlertViewWithTitle:(NSString *)title message:(NSString *)msg cancleButtonTitle:(NSString *)cancelTitle okButtonTitle:(NSString *)okTitle okClickHandle:(CHAlertViewOkClicked)okHandle cancelClickHandle:(CHAlertViewCancelClicked)cancelClickHandle{
    UIAlertView  *alert = [[UIAlertView alloc] initWithTitle:title message:msg delegate:self cancelButtonTitle:cancelTitle otherButtonTitles:okTitle,nil];
    if (okHandle) {
        alert.okBlock = okHandle;
    }
    if (cancelTitle) {
        alert.cancelBlock = cancelClickHandle;
    }
    [alert show];
}

#pragma mark -
+ (void)showCHAlertViewWithTitle:(NSString *)title message:(NSString *)msg cancleButtonTitle:(NSString *)cancelTitle okButtonTitle:(NSString *)okTitle otherButtonTitleArray:(NSArray*)otherTitleArray{
    [self showCHAlertViewWithTitle:title message:msg cancleButtonTitle:cancelTitle okButtonTitle:okTitle otherButtonTitleArray:otherTitleArray clickHandle:nil];
}

#pragma mark - UIAlertViewDelegate
+ (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{
    if (alertView.indexBlock) {
        alertView.indexBlock(buttonIndex);
    }else{
        if (buttonIndex == 0) {//取消
            if (alertView.cancelBlock) {
                alertView.cancelBlock();
            }
        }else{//確定            
            if (alertView.okBlock) {
                alertView.okBlock();
            }
        }
    }
}

@end

調(diào)用簡單粗暴

- (void)viewDidLoad {
    [super viewDidLoad];
    
    NSString *strTitle,*strMsg,*strCancel,*strOk;
    strTitle = @"提示";
    strMsg = @"來呀毡熏,互相傷害呀!";
    strCancel = @"不了";
    strOk = @"來就來";
    
    [CHAlertView showCHAlertViewWithTitle:strTitle message:strMsg cancleButtonTitle:strCancel okButtonTitle:strOk otherButtonTitleArray:nil];
    
    [CHAlertView showCHAlertViewWithTitle:strTitle message:strMsg cancleButtonTitle:strCancel okButtonTitle:strOk okClickHandle:^{
#warning TODO...
    } cancelClickHandle:^{
#warning TODO...
    }];
    
    [CHAlertView showCHCustomAlertViewWithTitle:strTitle message:strMsg cancleButtonTitle:strCancel okButtonTitle:strOk otherButtonTitleArray:nil clickHandle:^(NSInteger index) {
        NSLog(@"%ld",index);
#warning TODO...
    }];
}

(為什么要重構(gòu)侣诵?如何實施重構(gòu)痢法? 如果看到項目中有我本文開篇所用那種彈框方式的,大可封裝一個block的彈框方式來對其重構(gòu)了杜顺。)
沒有什么技術(shù)含量的干貨疯暑,歡迎分享,隨意使用哑舒。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市幻馁,隨后出現(xiàn)的幾起案子洗鸵,更是在濱河造成了極大的恐慌,老刑警劉巖仗嗦,帶你破解...
    沈念sama閱讀 211,948評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件膘滨,死亡現(xiàn)場離奇詭異,居然都是意外死亡稀拐,警方通過查閱死者的電腦和手機火邓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,371評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人铲咨,你說我怎么就攤上這事躲胳。” “怎么了纤勒?”我有些...
    開封第一講書人閱讀 157,490評論 0 348
  • 文/不壞的土叔 我叫張陵坯苹,是天一觀的道長。 經(jīng)常有香客問我摇天,道長粹湃,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,521評論 1 284
  • 正文 為了忘掉前任泉坐,我火速辦了婚禮为鳄,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘腕让。我一直安慰自己孤钦,他們只是感情好,可當我...
    茶點故事閱讀 65,627評論 6 386
  • 文/花漫 我一把揭開白布记某。 她就那樣靜靜地躺著司训,像睡著了一般。 火紅的嫁衣襯著肌膚如雪液南。 梳的紋絲不亂的頭發(fā)上壳猜,一...
    開封第一講書人閱讀 49,842評論 1 290
  • 那天,我揣著相機與錄音滑凉,去河邊找鬼统扳。 笑死,一個胖子當著我的面吹牛畅姊,可吹牛的內(nèi)容都是我干的咒钟。 我是一名探鬼主播,決...
    沈念sama閱讀 38,997評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼若未,長吁一口氣:“原來是場噩夢啊……” “哼朱嘴!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起粗合,我...
    開封第一講書人閱讀 37,741評論 0 268
  • 序言:老撾萬榮一對情侶失蹤萍嬉,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后隙疚,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體壤追,經(jīng)...
    沈念sama閱讀 44,203評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,534評論 2 327
  • 正文 我和宋清朗相戀三年供屉,在試婚紗的時候發(fā)現(xiàn)自己被綠了行冰。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片溺蕉。...
    茶點故事閱讀 38,673評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖悼做,靈堂內(nèi)的尸體忽然破棺而出疯特,到底是詐尸還是另有隱情,我是刑警寧澤贿堰,帶...
    沈念sama閱讀 34,339評論 4 330
  • 正文 年R本政府宣布辙芍,位于F島的核電站,受9級特大地震影響羹与,放射性物質(zhì)發(fā)生泄漏故硅。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,955評論 3 313
  • 文/蒙蒙 一纵搁、第九天 我趴在偏房一處隱蔽的房頂上張望吃衅。 院中可真熱鬧,春花似錦腾誉、人聲如沸徘层。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,770評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽趣效。三九已至,卻和暖如春猪贪,著一層夾襖步出監(jiān)牢的瞬間跷敬,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,000評論 1 266
  • 我被黑心中介騙來泰國打工热押, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留西傀,地道東北人。 一個月前我還...
    沈念sama閱讀 46,394評論 2 360
  • 正文 我出身青樓桶癣,卻偏偏與公主長得像拥褂,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子牙寞,可洞房花燭夜當晚...
    茶點故事閱讀 43,562評論 2 349

推薦閱讀更多精彩內(nèi)容

  • iOS網(wǎng)絡(luò)架構(gòu)討論梳理整理中扫步。盏袄。幸缕。 其實如果沒有APIManager這一層是沒法使用delegate的啃匿,畢竟多個單...
    yhtang閱讀 5,174評論 1 23
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,796評論 25 707
  • 工廠模式類似于現(xiàn)實生活中的工廠可以產(chǎn)生大量相似的商品,去做同樣的事情雷蹂,實現(xiàn)同樣的效果;這時候需要使用工廠模式。簡單...
    舟漁行舟閱讀 7,726評論 2 17
  • 一定有比你努力的人杯道,一定有和你一樣普通的人匪煌,一定有不如你厲害的人责蝠,這都是不同時期的你。
    Mazel閱讀 176評論 0 0
  • 那天萎庭,我和你在小區(qū)玩滑滑梯霜医。你玩得很起勁。現(xiàn)在的你驳规,能比較自主地玩這滑梯了肴敛。扶階梯上,順滑梯下吗购。有時医男,也不按常理...
    林冠軍閱讀 392評論 0 0