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

 

posted @ 2016-11-15 17:41  guangleijia  阅读(544)  评论(0编辑  收藏  举报