Runtime 实现 动态添加属性

Posted guangleijia

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

 

以上是关于Runtime 实现 动态添加属性的主要内容,如果未能解决你的问题,请参考以下文章

Runtime

iOS Runtime 动态添加属性不能添加intrinsic类型

C#自定义控件中如何动态添加属性

iOS的Runtime机制下给类别(category)添加属性替换原有类的方法执行

Runtime(动态添加方法)

Runtime objc4-779.1 为什么不能向一个已存在的类添加成员变量?有什么办法达到相同的效果?