iOS-button利用block封装按钮事件【runtime 关联】
用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 关联】的更多相关文章
- block传值以及利用block封装一个网络请求类
1.block在俩个UIViewController间传值 近期刚学了几招block 的高级使用方法,事实上就是利用block语法在俩个UIViewController之间传值,在这里分享给刚開始学习 ...
- 拦截iOS系统导航栏返回按钮事件-三种方法
方法一:在dealloc里面书写监听事件,因为只有pop才会调用dealloc,push不会掉用 - (void)dealloc {YLLog(@"123"); } 方法二:在- ...
- 转载 iOS拦截导航栏返回按钮事件的正确方式
原文链接:http://www.jianshu.com/p/25fd027916fa 当我们使用了系统的导航栏时,默认点击返回按钮是 pop 回上一个界面.但是在有时候,我们需要在点击导航栏的返回按钮 ...
- iOS拦截导航栏返回按钮事件的正确方式
当我们使用了系统的导航栏时,默认点击返回按钮是 pop 回上一个界面.但是在有时候,我们需要在点击导航栏的返回按钮时不一定要 pop 回上一界面,比如一个视频播放界面,进入横屏后,默认点击返回按钮仍然 ...
- iOS拦截导航栏返回按钮事件的正确方式(二)
当我们使用了系统的导航栏时,默认点击返回按钮是 pop 回上一个界面.但是在有时候,我们需要在点击导航栏的返回按钮时不一定要 pop 回上一界面,比如一个视频播放界面,进入横屏后,默认点击返回按钮仍然 ...
- 李洪强iOS开发之Block和协议
李洪强iOS开发之Block和协议 OC语言BLOCK和协议 一.BOLCK (一)简介 BLOCK是什么?苹果推荐的类型,效率高,在运行中保存代码.用来封装和保存代码,有点像函数,BLOCK可以在任 ...
- ios学习之block初探
1. block概念 block是ios4.0+和Mac osX 10.6以后引进的对C语言的拓展,用来实现匿名函数的特性.所谓匿名函数,也称闭包函数.即同意创建一个暂时的没有指定名称的函数. 最经经 ...
- iOS 学习 - 9.Block 入门
来自李明杰的视频. block 用来保存一段代码 block 的标志:^ block 跟函数很像: 1).可以保存代码 2).有返回值 3). 有形参 temp1:没有返回值.没有形参的 blo ...
- iOS利用block实现链式编程方法(Objective-C链式编程)
objc利用block实现链式编程方法 因为不好读.block和其他语言的匿名函数一样,很多程序员刚开始很难主动去用他. 本文描述block作为属性的实际使用,看懂block,并讲解如何利用block ...
随机推荐
- 一个WCF 数据序列化问题
public class EMMPBaseMsg { public String Data { get; set; } public DateTime AddTime { get; set; } pu ...
- mongodb知识积累
1: 安装mongodb https://www.cnblogs.com/zhangdaicong/p/7492494.html 2:配置文件 vi /etc/mongodb.conf https:/ ...
- s5-14 链路状态路由选择
为什么DV逐渐让位于LS? DV 站的不高,看得不远 完全相信邻居 LS 想办法站得高,看更远 多高.多远? 怎么做? 链路状态路由(Link State) 主要思想 发现 它的邻 ...
- 诡异的 ERROR 1045 (28000): Access denied for user 错误
问题描述: 用户已建,权限已赋予.long long ago这个用户是可以正常访问的,但是今天它就不能访问了.报错如下: ERROR 1045 (28000): Access denied for u ...
- Struts2之ModelDriven和Preparable拦截器
首先struts.xml文件配置如下 默认拦截器设置为paramsPrepareParamsStack <package name="default" namespace=& ...
- Struts2--HelloWord
Struts2官网 官网指南 官网下载Struts2.5-min-lib.zip解压把lib目录下jar包拷贝到web项目lib目录下 配置web.xml文件 <filter> <f ...
- 20155205 2016-2017-2 《Java程序设计》第8周学习总结
20155205 2016-2017-2 <Java程序设计>第8周学习总结 教材学习内容总结 第十四章 NIO使用频道来衔接数据节点,可以设定缓冲区容量,在缓冲区中对感兴趣的数据区块进行 ...
- JDBC连接SQL Server数据库
测试环境 数据库:SQL Server 2008 R2,创建数据库名:TestDemo,表:User,字段如下: 字段 字段 id UName UPass sqljdbc.jar下载地址:依赖的J ...
- noip第4课资料
- 《计算机科学基础》学习笔记_Part 1 Computer and Data
Technorati Tags: 计算机科学基础,读书笔记 Chapter 1. Introduction Ø 计算机:黑盒,Output Data=f(Input Data, Program) Ø ...