Runtime 实现 动态添加属性

利用动态加载为对象添加一个 block 点击属性;

.h 文件

1 #import <UIKit/UIKit.h>
2
3 @interface UIView (Tap)
4 /**
5  *  动态添加手势
6  */
7 - (void)setTapActionWithBlock:(void (^)(void))block ;
8 @end

.m 文件

 1 #import "UIView+Tap.h"
 2 #import <objc/runtime.h>
 3 /**
 4  *  动态添加手势
 5  */
 6 static const char *ActionHandlerTapGestureKey;
 7
 8 @implementation UIView (Tap)
 9
10 - (void)setTapActionWithBlock:(void (^)(void))block {
11
12     self.userInteractionEnabled = YES;
13
14     UITapGestureRecognizer *gesture = objc_getAssociatedObject(self, &ActionHandlerTapGestureKey);
15
16     if (!gesture) {
17         gesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleActionForTapGesture:)];
18         [self addGestureRecognizer:gesture];
19         objc_setAssociatedObject(self, &ActionHandlerTapGestureKey, gesture, OBJC_ASSOCIATION_RETAIN);
20     }
21
22     objc_setAssociatedObject(self, &ActionHandlerTapGestureKey, block, OBJC_ASSOCIATION_COPY);
23 }
24
25 - (void)handleActionForTapGesture:(UITapGestureRecognizer *)gesture {
26     if (gesture.state == UIGestureRecognizerStateRecognized)  {
27         void(^action)(void) = objc_getAssociatedObject(self, &ActionHandlerTapGestureKey);
28         if (action)  {
29             action();
30         }
31     }
32 }
33 @end
时间: 2024-10-13 05:03:08

Runtime 实现 动态添加属性的相关文章

Runtime(动态添加属性)

下面通过一个实例展示一下Runtime(动态添加属性)的用法

runtime动态添加属性

<span style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19.5px; background-color: rgb(254, 254, 242);">使用运行时库,必须要先引入 objc/runtime.h</span> <span style="font-family: Verdana, Arial, Helve

JavaScript自定义事件,动态添加属性

根据事件的不同,可用的自定义方法也不同. document.createEvent('Event'); 实现主要有4个步骤: 1.创建事件. 2.初始化事件(三个参数:事件名,是否起泡,是否取消默认触发) 3.监听事件 4.触发事件 var Evt = document.createEvent('Event');//创建一个事件 Evt.initEvent('inputChangeEvt', true, true);//初始化事件,给定事件名字 window.addEventListener('

如何遍历json属性和动态添加属性

var person= { name: 'zhangsan', pass: '123' , 'sni.ni' : 'sss', hello:function (){ for(var i=0;i<arguments.length;i++){ //在不知参数个数情况下可通过for循环遍历 // arguments这个是js 默认提供 alert("arr["+i+"]="+arguments[i]); } } } //遍历属性 for(var item in pe

04JS高级动态添加属性和删除属性

<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <title></title> <script type ="text/javascrip

Python3动态添加属性,删除属性,判断属性函数

动态添加属性是指在类的外面给对象动态绑定属性,添加的方法有两种:1.直接绑定到对象上,例如:p.name="Tom"2.使用setattr函数:setattr(p,'name','Tom')判断对象是否拥有某个属性:hasattr(p,'name'),返回布尔值:也可以用来判断对象是否拥有某个方法删除某个属性:del关键字:del p.namedelattr函数:delattr(p,'name') 原文地址:https://blog.51cto.com/13560219/2479011

ios动态添加属性的几种方法

http://blog.csdn.net/shengyumojian/article/details/44919695 在ios运行过程中,有几种方式能够动态的添加属性. 1-通过runtime动态关联对象 主要用到了objc_setAssociatedObject,objc_getAssociatedObject以及objc_removeAssociatedObjects [objc] view plain copy //在目标target上添加关联对象,属性名propertyname(也能用

iOS动态性:动态添加属性的方法——关联(e.g. 向Category添加属性)

想到要如何为所有的对象增加实例变量吗?我们知道,使用Category可以很方便地为现有的类增加方法,但却无法直接增加实例变量.不过从Mac OS X v10.6开始,系统提供了Associative References,这个问题就很容易解决了.这种方法也就是所谓的关联(association),我们可以在runtime期间动态地添加任意多的属性,并且随时读取.所用到的两个重要runtime API是: 1 OBJC_EXPORT void objc_setAssociatedObject(id

【原】iOS中动态添加属性的方法——关联(e.g. 向Category添加成员变量)

想到要如何为所有的对象增加实例变量吗?我们知道,使用Category可以很方便地为现有的类增加方法,但却无法直接增加实例变量.不过从Mac OS X v10.6开始,系统提供了Associative References,这个问题就很容易解决了.这种方法也就是所谓的关联(association),我们可以在runtime期间动态地添加任意多的属性,并且随时读取.所用到的两个重要runtime API是: OBJC_EXPORT void objc_setAssociatedObject(id o