当一个控制器里面有很多UIAlertView 的时候,你要获取当前用户操作的是那个UIAlertView 很是麻烦,先你要设置他的tag 值,然后你在代理里面要判断tag,要是有10个,这时候你就凌乱了,忘了自己设置了那个是哪个。
那我们今天就把UIAlertView改成block回调方式,大家可以参考参考,顺便把UIActionSheet,UIImagepickerViewcontroller 也写成自己的blocks。
大家也跟我一起自定义个UIAlertView吧
还是先看下效果图吧:
一.常规blocks封装
1.新建一个继承自NSObject的ICInfomationView
在ICInfomationView.h 文件中我们加入#import
写一个blocks 变量类型,我们下面使用
typedef void (^ClickAtIndexBlock)(NSInteger buttonIndex);
遵循
2.定义一个类方法,我们这个方法接受我们在使用的时候传入的参数
// 我们设置的参数名都是模仿系统的名字来的
+(UIAlertView )initWithTitle:(NSString)title message:(NSString *)messge cancleButtonTitle:(NSString )cancleButtonTitle OtherButtonsArray:(NSArray)otherButtons clickAtIndex:(ClickAtIndexBlock) clickAtIndex;
在ICInfomationView.m文件中
在头部我们定义一个static 的blocks 变量
static ClickAtIndexBlock _ClickAtIndexBlock;
-实现这个类方法
+(UIAlertView )initWithTitle:(NSString)title message:(NSString *)messge cancleButtonTitle:(NSString )cancleButtonTitle OtherButtonsArray:(NSArray)otherButtons clickAtIndex:(ClickAtIndexBlock) clickAtIndex;
{
_ClickAtIndexBlock = [clickAtIndex copy];
UIAlertView *Al = [[UIAlertView alloc] initWithTitle:title message:messge delegate:self cancelButtonTitle:cancleButtonTitle otherButtonTitles: nil];
for (NSString *otherTitle in otherButtons) {
[Al addButtonWithTitle:otherTitle];
}
[Al show];
return Al;
}
-实现UIAlertView 的两个代理
pragma mark UIAlertViewDelegate
+(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
_ClickAtIndexBlock(buttonIndex);
}
+(void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex
{
_ClickAtIndexBlock = nil;
}
到此我们自己封装的UIAlertView结束了, 以后要是用的时候非常简单,就一句代码,再也不用tag值和遵守协议实现代理了
[ICInfomationView initWithTitle:@"哈哈,我没有使用代理,我是blocks" message:@"呵呵" cancleButtonTitle:@"好吧" OtherButtonsArray:@[@"嗯呢"] clickAtIndex:^(NSInteger buttonAtIndex) {
NSLog(@"click index ====%ld",(long)buttonAtIndex);
}];
二.增加使用 runtime 封装方法
runtime用的最多的就是关联(Association)
1、建立关联
objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy)
参数解释
object:关联对象(id 可以为任意对象)
key :常量键
value:值(id 可以是任意值)
objc_AssociationPolicy:对象关联策略
解释:任意对象可以通过一个常量键关联任意值
2、获得关联
objc_getAssociatedObject(id object, const void *key)
object:关联对象(id 可以为任意对象)
key :常量
解释:通过一个键获得一个对象关联值
本程序中用到的两个方法
-(void)setClickBlock:(ClickAtIndexBlock)block{
objc_setAssociatedObject(self, IC_alertView_Block, block, OBJC_ASSOCIATION_COPY);
}
-(ClickAtIndexBlock)clickBlock{
return objc_getAssociatedObject(self, IC_alertView_Block);
}
UIAlertView原生代理调用
pragma mark UIAlertViewDelegate
+(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
if (alertView.clickBlock) {alertView.clickBlock(buttonIndex); }
}
猛戳代码github点击代码