iOS开发中不想用delegate协议方法怎么办?

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

你可能感兴趣的:(iOS开发中不想用delegate协议方法怎么办?)