用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. STL六大组件

    1.容器 顺序容器.关联容器 2.算法 各种常用算法,sort.search.copy…… 3.迭代器 用来索引容器中元素,是容器与算法之间的胶合剂 4.仿函数(另名函数对象) 仿函数就是让一个类的使 ...

  2. Linux无法解析gitlib的地址--修改dns

    搞的一个js鉴权认证,先跳转到 gitlib,登录后跳转到我们公司测试接口的页面: 公司gitlib地址:gitlab.cmread.com [INFO][2018-12-17 15:29:00,18 ...

  3. svn 提交代码 自动过滤技巧

    操作 在用svn管理版本时,有时希望在提交到服务器时,能过滤掉指定后缀名的所有文件,或指定名称的文件夹.文件名. 常见的文件夹名称和文件名如下: bin obj debug temppe *.suo ...

  4. FreeMarker 处理不存在的变量

    FreeMarker不能容忍引用不存在的变量,除非明确地告诉它当变量不存在时如何处理.这里介绍两种典型的处理方法. 一个不存在的变量和一个是null的变量,对于FreeMarker来说是一样的. 处理 ...

  5. HDU1864 最大报销额

    Description 现有一笔经费可以报销一定额度的发票.允许报销的发票类型包括买图书(A类).文具(B类).差旅(C类),要求每张发票的总额不得超过1000元,每张发票上,单项物品的价值不得超过6 ...

  6. PuTTY乱码问题解决办法

    原文链接:http://www.henshiyong.com/archives/403.html 使用PuTTY 时,遇到了乱码问题,查看了别人介绍的信息,解决掉了. 方法其实很简单,现在分享出来. ...

  7. Docker Compose部署lnmp

    参考:https://github.com/micooz/docker-lnmp 一.简介 使用Dcoekr镜像部署lnmp(Linux.Nginx.MySQL.PHP7). 1.1 结构 app └ ...

  8. jpa命名规范

      Keyword Sample JPQL snippet And findByLastnameAndFirstname … where x.lastname = ?1 and x.firstname ...

  9. Java 是值传递

    本质:传值/传地址值   以下搬运自知乎大佬   作者:Intopass链接:https://www.zhihu.com/question/31203609/answer/50992895来源:知乎著 ...

  10. js-数组方法push

    <script type="text/javascript">        var arr=[1,2,3,4,5]        arr.push(6,7)      ...