用block封装最常用的就是网络请求的回调,其实也可以结合category封装button的按钮事件,同时利用runtime的对象关联;

UIButton+wkjButton.h 文件

#import <UIKit/UIKit.h>

typedef void(^btnClickAction)(UIButton *button);

@interface UIButton (wkjButton)
//@property(nonatomic,copy)btnClickAction blockAction; /**
新建button >>
bgColor:默认白色
fontColor:默认黑色
*/
+ (UIButton *)wkj_buttonFrame:(CGRect)frame
title:(NSString *)title
bgColor:(UIColor *)bgColor
fontColor:(UIColor *)fontColor
fontSize:(CGFloat)fontSize
fontBold:(BOOL)bold
action:(btnClickAction)actionBlock;
@end

UIButton+wkjButton.m 文件

#import "UIButton+wkjButton.h"

//关联对象的key
static NSString *keyOfButtonMethod; //读取属性 block的key【暂时无用】
//static NSString *keyOfActionBlock; @implementation UIButton (wkjButton) /**
新建button >>
bgColor:默认白色
fontColor:默认黑色
*/
+ (UIButton *)wkj_buttonFrame:(CGRect)frame
title:(NSString *)title
bgColor:(UIColor *)bgColor
fontColor:(UIColor *)fontColor
fontSize:(CGFloat)fontSize
fontBold:(BOOL)bold
action:(btnClickAction)actionBlock{ UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; button.frame = frame;
[button setTitle:title forState:UIControlStateNormal];
if (bgColor) {
button.backgroundColor = bgColor;
}
else{
button.backgroundColor = [UIColor whiteColor];
} if (fontColor) {
[button setTitleColor:fontColor forState:UIControlStateNormal];
}
else{
[button setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
} if (bold) {
button.titleLabel.font = [UIFont wkj_boldFontSize:fontSize];
}
else{
button.titleLabel.font = [UIFont systemFontOfSize:fontSize];
} [button addTarget:button action:@selector(wkj_buttonClick:) forControlEvents:UIControlEventTouchUpInside]; ///runtime 方法关联
objc_setAssociatedObject(button, &keyOfButtonMethod, actionBlock, OBJC_ASSOCIATION_COPY_NONATOMIC);
return button;
}
- (void)wkj_buttonClick:(UIButton *)button{
///如果用self.blockAction 要添加get set 方法,这里是直接取到关联的block ///通过key【keyOfMethod】获取关联对象
btnClickAction block = (btnClickAction)objc_getAssociatedObject(button, &keyOfButtonMethod);
if (block) {
block(button);
}
} ///如果要实现属性读取,添加 get set 方法
//- (btnClickAction)blockAction{
// return objc_getAssociatedObject(self, &keyOfActionBlock);
//}
//- (void)setBlockAction:(btnClickAction)blockAction{
// objc_setAssociatedObject(self, &keyOfActionBlock, blockAction, OBJC_ASSOCIATION_COPY_NONATOMIC);
//}
} @end

iOS-button利用block封装按钮事件【runtime 关联】的更多相关文章

  1. block传值以及利用block封装一个网络请求类

    1.block在俩个UIViewController间传值 近期刚学了几招block 的高级使用方法,事实上就是利用block语法在俩个UIViewController之间传值,在这里分享给刚開始学习 ...

  2. 拦截iOS系统导航栏返回按钮事件-三种方法

    方法一:在dealloc里面书写监听事件,因为只有pop才会调用dealloc,push不会掉用 - (void)dealloc {YLLog(@"123"); } 方法二:在- ...

  3. 转载 iOS拦截导航栏返回按钮事件的正确方式

    原文链接:http://www.jianshu.com/p/25fd027916fa 当我们使用了系统的导航栏时,默认点击返回按钮是 pop 回上一个界面.但是在有时候,我们需要在点击导航栏的返回按钮 ...

  4. iOS拦截导航栏返回按钮事件的正确方式

    当我们使用了系统的导航栏时,默认点击返回按钮是 pop 回上一个界面.但是在有时候,我们需要在点击导航栏的返回按钮时不一定要 pop 回上一界面,比如一个视频播放界面,进入横屏后,默认点击返回按钮仍然 ...

  5. iOS拦截导航栏返回按钮事件的正确方式(二)

    当我们使用了系统的导航栏时,默认点击返回按钮是 pop 回上一个界面.但是在有时候,我们需要在点击导航栏的返回按钮时不一定要 pop 回上一界面,比如一个视频播放界面,进入横屏后,默认点击返回按钮仍然 ...

  6. 李洪强iOS开发之Block和协议

    李洪强iOS开发之Block和协议 OC语言BLOCK和协议 一.BOLCK (一)简介 BLOCK是什么?苹果推荐的类型,效率高,在运行中保存代码.用来封装和保存代码,有点像函数,BLOCK可以在任 ...

  7. ios学习之block初探

    1. block概念 block是ios4.0+和Mac osX 10.6以后引进的对C语言的拓展,用来实现匿名函数的特性.所谓匿名函数,也称闭包函数.即同意创建一个暂时的没有指定名称的函数. 最经经 ...

  8. iOS 学习 - 9.Block 入门

    来自李明杰的视频. block 用来保存一段代码 block 的标志:^ block  跟函数很像: 1).可以保存代码  2).有返回值  3). 有形参 temp1:没有返回值.没有形参的 blo ...

  9. iOS利用block实现链式编程方法(Objective-C链式编程)

    objc利用block实现链式编程方法 因为不好读.block和其他语言的匿名函数一样,很多程序员刚开始很难主动去用他. 本文描述block作为属性的实际使用,看懂block,并讲解如何利用block ...

随机推荐

  1. hdu-1255(线段树求面积并)模板

    题目链接:传送门 思路: (1)建立线段的信息,每个线段存储l到r的线段的x位置和y的起始点与终点. 建立线段树的节点信息,每个节点代表一个区间的信息,x表示区间的横坐标的位置,l,r表示纵坐标的范围 ...

  2. poj-3667(线段树区间合并)

    题目链接:传送门 参考文章:传送门 思路:线段树区间合并问题,每次查询到满足线段树的区间最左值,然后更新线段树. #include<iostream> #include<cstdio ...

  3. Le Chapitre IV

    J'avais ainsi appris une seconde chose très importante: C'est que sa planète d'origine était à peine ...

  4. Codeforces Round #548 (Div. 2) D 期望dp + 莫比乌斯反演

    https://codeforces.com/contest/1139/problem/D 题意 每次从1,m中选一个数加入队列,假如队列的gcd==1停止,问队列长度的期望 题解 概率正着推,期望反 ...

  5. linux学习--查看cpu及内存信息

    查看物理cpu个数: cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l 查看每个cpu核数 cat /proc/cp ...

  6. Tomcat服务器的安装和配置

    一.Tomcat下载 可以直接从Apache的网站上下载Tomcat(http://tomcat.apache.org/),进入首页后,在左边Download一栏可选择你要下载的版本,点击便可进入To ...

  7. Mybatis-Plus 实战完整学习笔记(八)------delete测试

    1.根据ID删除一个员工deleteById /** * 删除客户 * * @throws SQLException */ @Test public void deletedMethod() thro ...

  8. 程序重复报more than 'max_user_connections' active connections问题解决

    早晨,开发扔过来一个问题,截图如下: ums already has more than 'max_user_connections' active connections 查看数据库发现: 最大连接 ...

  9. struts2访问web资源

    通过ActionContext访问 public class TestActionContextAction { public String execute(){ //获取 ActionContext ...

  10. js 上传文件夹

    最近公司做工程项目,实现文件夹上传. 网上找了一天,发现网上很多代码都存在相似问题,最后终于找到了一个符合要求的项目. 工程如下: 这里对项目的文件传输功能做出分析,怎么实现文件夹上传的,如何进行文件 ...