开发IOS时经常会使用到UIAlertView类,该类提供了一种标准视图,可向用户展示警告信息。当用户按下按钮关闭该视图时,需要用委托协议(Delegate protocol)来处理此动作,但是要设置好这个委托协议,就得把创建警告视图和处理按钮动作的代码分开。
UIAlertView *inputAlertView = [[UIAlertView alloc] initWithTitle:@"Add a new to-do item:" message:nil delegate:self cancelButtonTitle:@"Dismiss" otherButtonTitles:@"Add", nil];
//UIAlertViewDelegate protocol method
- (void)alertView:(UIAlertView *)alertView clickButtonAtButtonIndex:(NSInteger)buttonIndex {
if (buttonIndex == 0) {
[self doCancel];
} else {
[self doContinue];
}
}
假如想在一个类中处理多个UIAlertView,那么代码会更加复杂,需要在delegate方法中加入对AlertView的tag的判断。
如果能在创建UIAlertView时把处理每个按钮的逻辑写好,那就简单多了,我们可以使用BLOCK来完成。
一、使用Category +Associate Object +Block
//UIAlertView+FHBlock.h
typedef void (^FHAlertViewCompletionBlock)(UIAlertView *alertView, NSInteger buttonIndex);
@interface UIAlertView (FHBlock) <UIAlertViewDelegate>
@property(nonatomic,copy) FHAlertViewCompletionBlock completionBlock;
@end
//UIAlertView+FHBlock.m
#import <objc/runtime.h>
@implementation UIAlertView (FHBlock)<UIAlertViewDelegate>
- (void)setCompletionBlock:(FHAlertViewCompletionBlock)completionBlock {
objc_setAssociatedObject(self, @selector(completionBlock), completionBlock, OBJC_ASSOCIATION_COPY_NONATOMIC);
if (completionBlock == NULL) {
self.delegate = nil;
}
else {
self.delegate = self;
}
}
- (FHAlertViewCompletionBlock)completionBlock {
return objc_getAssociatedObject(self, @selector(completionBlock));
}
#pragma mark - UIAlertViewDelegate
- (void)alertView:(UIAlertView *)alertView clickButtonAtButtonIndex:(NSInteger)buttonIndex {
if (self.completionBlock) {
self.completionBlock(self, buttonIndex);
}
}
@end
二、inheritance+Block
//FHAlertView.h
typedef void(^AlertBlock)(UIAlert* alert,NSInteger buttonIndex);
@interface FHAlertView:UIAlertView
@property(nonatomic,copy) AlertBlock completionBlock;
//FHAlertView.m
#pragma mark - UIAlertViewDelegate
- (void)alertView:(UIAlertView *)alertView clickButtonAtButtonIndex:(NSInteger)buttonIndex {
if (self.completionBlock) {
self.completionBlock(self, buttonIndex);
}
}
@end