iOS开发中不想用delegate协议方法怎么办?那就用block!
前两天在网上看到大神将alertView的delegate协议方法转为block实现,实在是大快我心(其实一开始我就不喜欢delegate的,偏向block,现在也在block学习路上)
先展示一下使用
UIAlertView *customAlertView = [[UIAlertView alloc] initWithTitle:title message:message delegate:self cancelButtonTitle:@"取消"otherButtonTitles:@"确定",nil];
[customAlertView showAlertViewWithCompleteBlock::^(UIAlertView*alertView,NSInteger buttonIndex) {
// code
}];
这样alert的delegate就不用去写了,是不是很方便😄!
这个UIAlertView+Block实现方式是利用runtime来实现,在系统调用alert的delegate时,将其转化为block,代码很简单,能想出来,却不简单,谢谢这位大神,代码贴出来(详细注释)
新建AlertView的分类 UIAlertView+Block
.h
// 先定义一个 block结果回调
typedef void(^CompleteBlock) (UIAlertView *alertView, NSInteger buttonIndex);
@interfaceUIAlertView (Block)
// 显示alertView
- (void)showAlertViewWithCompleteBlock:(CompleteBlock)block;
@end
.m
#import"UIAlertView+Block.h"
#import
@implementationUIAlertView (Block)
staticcharkey;
-(void)showAlertViewWithCompleteBlock:(CompleteBlock)block
{
//首先判断这个block是否存在
if(block) {
//这里用到了runtime中绑定对象,将这个block对象绑定alertview上
objc_setAssociatedObject(self, &key,block,OBJC_ASSOCIATION_COPY);
//设置delegate
self.delegate=self;
}
//弹出提示框
[selfshow];
}
- (void)alertView:(UIAlertView*)alertView clickedButtonAtIndex:(NSInteger)btnIndex
{
//拿到之前绑定的block对象
CompleteBlockblock =objc_getAssociatedObject(self, &key);
//移除所有关联
objc_removeAssociatedObjects(self);
if(block) {
//调用block传入此时点击的按钮index
block(alertView, btnIndex);
}
}
@end
网友评论