用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. 百度地图经纬度和地址互转(Java代码)

    这是基于springmvc+mybatis 的一个controller.如果不是这个框架,可以把方法实体抽到自己写的一个类中,然后再测试 package com.uwitec.controller.s ...

  2. react组件父传子

    react组件父传子,子组件使用父组件的数据,用props import React, { Component } from 'react'; class App extends Component ...

  3. openstack网络基本概念(转)

    OpenStack的Neutron能够管理OpenStack环境中的虚拟 网络基础设施(VNI).和物理网络基础设施(PNI). OpenStack的Neutron同意租户创建虚拟网络拓扑结构.包括的 ...

  4. IntelliJ IDEA 2017版 spring-boot2.0.2 自动配置Condition

    描述: 编译器修改参数      -Dfile.encoding=GBK     -Dstr.encoding=GBK Condition位置: 某一个类或注解存在的时候,装配,否则不装配 相关代码: ...

  5. C语言的问题,头文件:keil也许有漏洞

    2018-06-15   16:52:03 ------------------------------------------------------------------------------ ...

  6. 好文推荐系列--------(2)GruntJS——重复乏味的工作总会有人做(反正我不做)

    GruntJS 是基于JavaScript的命令行构建工具,它可以帮助开发者们自动化重复性的工作.你可以把它看成是JavaScript下的Make或者Ant.它可以完成诸如精简.编译.单元测试.lin ...

  7. VB连接MYSQL数据的方法

    原文链接:http://hanbaohong.iteye.com/blog/704800 第一步:上网http://dev.mysql.com/downloads/connector/odbc/下载m ...

  8. 使用 vs.php 调试PHP相关问题

    1. 使用mysql_connect()方法时报错"Call to undefined function mysql_connect()" 这是由于在php.ini没有启用mysq ...

  9. JDBC架构

    JDBC API支持两层和三层处理模型进行数据库访问,但在一般的JDBC体系结构由两层组成: JDBC API: 提供了应用程序对JDBC的管理连接. JDBC Driver API: 支持JDBC管 ...

  10. Hdu1281 棋盘游戏

    棋盘游戏 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...