在iOS开发中UIAlertView是我们最常用的控件,使用它的方法也非常简单,但是如果在一个页面需要多个UIAlertView,我们可以用tag值标记,然后在UIAlertView的代理方法里面来判断点击的是那个UIAlertView,从而进行相应的逻辑处理,那么这样一来会有两个弊端!
第一:代码不整洁,不美观.
第二:逻辑分离,不利于以后维护.
为了避免以上两点,我们写一个UIAlertView分类,用block来代替他的代理方法,
首先.h文件
#import <UIKit/UIKit.h>
@interface UIAlertView (Block)
- (void)handlerClickedButton:(void (^)(NSInteger btnIndex))aBlock;
@end
然后.m文件的实现:
#import "UIAlertView+Block.h"
#import <objc/runtime.h>
@implementation UIAlertView (Block)
- (void)handlerClickedButton:(void (^)(NSInteger btnIndex))aBlock{
self.delegate = self;
objc_setAssociatedObject(self, @"UIAlertView_key_clicked", aBlock, OBJC_ASSOCIATION_COPY);
}
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{
void (^block)(NSInteger btnIndex) = objc_getAssociatedObject(self, @"UIAlertView_key_clicked");
if (block) block(buttonIndex);
}
@end
最后外部调用
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"温馨提示"message:@"欢迎光临"delegate:nil cancelButtonTitle:@"关闭"otherButtonTitles:@"开启",nil];
[alert handlerClickedButton:^(NSInteger btnIndex) {
if (btnIndex == 0) {
//逻辑处理
}
else {
//逻辑处理
}
}];
[alert show];
这样是不是感觉清爽多了,逻辑梳理起来也顺畅了,不用在去找他的代理方法了!
注:该文中涉及到 runtime的知识点,我会专门写一篇文件专门讲解!