本文主要介绍了两种改写UIButton的点击事件方法——继承UIButton跟给UIButton添加一个分类。附代码

方法一:继承UIButton

UIButtonBlock.h文件 如下

#import <UIKit/UIKit.h>

typedef void (^ClickActionBlock) (id obj);

@interface UIButtonBlock : UIButton

@property (nonatomic,strong)ClickActionBlock caBlock;

- (void)initWithBlock:(ClickActionBlock)clickBlock for:(UIControlEvents)event;

@end

UIButtonBlock.m文件如下:

#import "UIButtonBlock.h"

@implementation UIButtonBlock

- (void)initWithBlock:(ClickActionBlock)clickActionBlock for:(UIControlEvents)event{

[self addTarget:self action:@selector(goAction:) forControlEvents:event];

self.caBlock = clickActionBlock;

}

- (void)goAction:(UIButton *)btn{

self.caBlock(btn);

}

附使用方法。。。。。我这里是用storyboard拖出来的按钮。首先要在storyboard里的Button关联这个UIButtonBlock这个类

然后就是使用:

……

[self.clickButton initWithBlock:^(id obj) {

NSLog(@"继承之UIButton============%@",obj);

} for:UIControlEventTouchUpInside];

有同学觉得多此一举,这里不作解释。

方法二:给UIButton添加一个分类

UIButton+Block.h文件如下

#import <UIKit/UIKit.h>

typedef void (^ClickActionBlock) (id obj);

@interface UIButton (Block)

- (void)initWithBlock:(ClickActionBlock)clickBlock for:(UIControlEvents)event;

@end

UIButton+Block.m文件如下

#import "UIButton+Block.h"

#import <objc/runtime.h>

static id key;

@implementation UIButton (Block)

- (void)initWithBlock:(ClickActionBlock)clickBlock for:(UIControlEvents)event{

objc_setAssociatedObject(self, &key, clickBlock, OBJC_ASSOCIATION_COPY_NONATOMIC);

[self addTarget:self action:@selector(goAction:) forControlEvents:event];

}

- (void)goAction:(UIButton *)sender{

ClickActionBlock block = (ClickActionBlock)objc_getAssociatedObject(self, &key);

if (block) {

block(sender);

}

}

使用方法:

……

[self.blockButton initWithBlock:^(id obj) {

NSLog(@"Runtime block============%@",obj);

} for:UIControlEventTouchUpInside ];

方法一:使用注意如果手写的UIButton需要在UIButtonBlock中再写一个初始化方法。如果是从xib拖出来的是需要关联的。

两种方法都实现了通过块来实现UIButton的addtarget方法中的@select方法的回调。代码比较粗糙大家将就着看着。

UIButton之Block回调的更多相关文章

  1. 第十篇、自定义UIBarButtonItem和UIButton block回调

    // 自定义导航栏左边按钮 self.navigationItem.leftBarButtonItem = [JQBlockedBarButtonItem blockedBarButtonItemWi ...

  2. iOS很重要的 block回调

    刚刚进入ios开发行业,发现开发中要用到大量的block回调,由此可见它的重要性.学习它之前我也是网上找的资料,推荐这篇文章http://blog.csdn.net/mobanchengshuang/ ...

  3. 63.delegate回调 和block回调

    效果:viewController里面放置一个按钮和Lab,点击按钮进入oneViewController(delegate回调)或者BlockViewController(block回调),两者控制 ...

  4. iOS 键盘添加完成按钮,delegate和block回调

    这个是一个比较初级一点的文章,新人可以看看.当然实现这个需求的时候自己也有一点收获,记下来吧. 前两天产品要求在工程的所有数字键盘弹出时,上面带一个小帽子,上面安装一个“完成”按钮,这个完成按钮也没有 ...

  5. Objective-C中的Block回调模式

    在前面的博客中提到了Block的概念和使用方法,个人感觉Block最爽的用法莫过于在回调时用block.感觉比委托回调和目标方法回调用着要顺手,好不好用还得读者亲自用一下才知道.如果 读者之前用过SS ...

  6. Block回调

    •Block的定义   •Block.委托.通知.回调函数,它们虽然名字不一样,但是原理都一样,都是"回调机制"的思想的具体实现 •前面的代理模式的项目改为Block回调实现    ...

  7. UIAlertController——之Block回调

    iOS8.0之后出现的提示框 =.=,比自己去改block回调要好.

  8. 代码块(Block)回调一般阐述

    本章教程主要对代码块回调模式进行讲解,已经分析其他回调的各种优缺点和适合的使用场景. 代码块机制 Block变量类型 Block代码封装及调用 Block变量对普通变量作用域的影响 Block回调接口 ...

  9. iOS开发-Block回调

    关于Block之前有一篇文章已经写过一篇文章Object-C-代码块Block回顾,不过写的比较浅显,不能体现出Block在实际开发中的重要性,关于Block的基础知识,可以参考之前的博客.在实际开发 ...

随机推荐

  1. MySQL学习笔记(二)

    二.SQL基本知识 SQL 是一种典型的非过程化程序设计语言,这种语言的特点是:只指定哪些数据被操纵,至于对这些数据要执行哪些操作,以及这些操作是如何执行的,则未被指定.非过程化程序设计语言的优点在于 ...

  2. dll显式加载与隐式加载

    使用动态DLL有两种方法,一种是隐式链接,一种是显式链接,如果用loadlibrary就是显示链接,用lib就属于隐式链接. 两种方法对于你的程序调用动态库时没有任何区别,只是你在编程时,步骤是不一样 ...

  3. curl 取不到第二个参数解决方法

    curl http://127.0.0.1:8083/search/add_index_quan_bc?option=1&channelId=139 在Linux下执行这个命令,观察日志发现, ...

  4. 0302 关于IT行业的就业感想

    一,后感 看完了这两篇文章之后,我得到的感受是IT行业还是十分有活力的一个行业,但是在这种经济环境下和参与的就业毕业生的人数增加,直接导致了我们面对的就业形势变的十分严峻,但是作为一个商业软件专业的学 ...

  5. Nginx 日志按天分割

    #nginx日志切割脚本 #!/bin/bash #设置日志文件存放目录 logs_path="/home/www.xxx.com/wwwlogs/" #设置pid文件 pid_p ...

  6. git备忘(长久更新)

    一直想了解一下git,正好最近的有一个问题就是,实验室写的代码,怎么同步到自己宿舍的笔记本上面来.最开始想用dropbox,但是用VS的人都知道,工程文件里面会给你生成乱七八糟的很多东西,很占空间,d ...

  7. vim与shell的切换

    方法1: vim->shell: ctrl-z (挂起vim进程,相当于图形界面中的最小化) shell->vim: fg (foreground)   方法2: vim->shel ...

  8. Visitor

    #include <iostream> #include <vector> using namespace std; #define DESTROY_POINTER(ptr) ...

  9. MySQL连接语法

    http://www.cnblogs.com/hanzhaoxin/p/3590642.html 内连接:INNER  JOIN 内连接为 两个表中必须都同时满足条件 内连接,即最常见的等值连接自然连 ...

  10. Web Service 中返回DataSet结果的几种方法

    Web Service 中返回DataSet结果的几种方法: 1)直接返回DataSet对象    特点:通常组件化的处理机制,不加任何修饰及处理:    优点:代码精减.易于处理,小数据量处理较快: ...