UIAlertView是我们代码里面最常使用的一个控件之一了,不过在iOS9.0之后就被苹果淘汰了,具体原因不知道,不过使用过UIAlertView的朋友们应该都被UIAlertViewDelegate里的那一窜长长的if..else判断搞的很头疼,特别是一个页面有多个UIAlertView时...
相信每个人可能都有自己相应的解决办法了,使用一个新的类(继承或封装)来将UIAlertView的处理逻辑和初始化代码同步是比较常见的,我接下来就用关联对象在传统使用方式上做小小的修改,代码如下:
先定义关联对象的Key和UIAlertView处理的block变量类型:
static NSString *MW_ALERT_KEY = @"alertView";
typedef void(^AlertAction)(NSInteger);
编写UIAlertView初始化和show并设置关联对象:
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"提示" message:@"这个一个关联对象的测试" delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"确定", nil];
AlertAction alertActionBlock = ^(NSInteger index){
if (index == 0) {
NSLog(@"点击了取消");
}else if(index == 1){
NSLog(@"点击了确定");
}
};
objc_setAssociatedObject(alertView, &MW_ALERT_KEY, alertActionBlock, OBJC_ASSOCIATION_COPY_NONATOMIC);
[alertView show];
最后在UIAlertView的回方法中取出block并执行:
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{
AlertAction alertActionBlock = objc_getAssociatedObject(alertView, &MW_ALERT_KEY);
alertActionBlock(buttonIndex);
}
是不是发现代码清晰很多,没有弹框的业务处理和定义放在了一起,看代码的时候就容易很多了