美文网首页
iOS开发中不想用delegate协议方法怎么办?

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

作者: 温特儿 | 来源:发表于2016-03-08 18:11 被阅读333次

    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协议方法怎么办?

          本文链接:https://www.haomeiwen.com/subject/zbyzkttx.html