1. 程式人生 > >【OC】給UIView、UILabel、UIImageView等等繼承UIView的控制元件新增點選功能

【OC】給UIView、UILabel、UIImageView等等繼承UIView的控制元件新增點選功能

#import <UIKit/UIKit.h>
typedef void(^actionBlock)(void);

@interface UIView (UIViewController)

/**
 得到View所在的控制器

 @return 控制器
 */
- (UIViewController *)viewController;

/**
 給View新增點選事件

 @param block 事件傳遞
 */
- (void)tapActionGesture:(actionBlock)block;
@end
#import "UIView+UIViewController.h"
NSMutableDictionary *blockActionDict; @interface UIView () @end @implementation UIView (UIViewController) - (UIViewController *)viewController { //通過響應者鏈,取得此檢視所在的檢視控制器 UIResponder *next = self.nextResponder; do { //判斷響應者物件是否是檢視控制器型別 if ([next isKindOfClass:[UIViewController
class]]) { return (UIViewController *)next; } next = next.nextResponder; }while(next != nil); return nil; } /** 給View新增點選事件 @param block 事件傳遞 */ - (void)tapActionGesture:(actionBlock)block{ [self addBlock:block]; [self whenTouchOne]; } -(void)addBlock:(actionBlock)block{ if
(blockActionDict == nil){ blockActionDict = [[NSMutableDictionary alloc]init]; } NSLog(@"%lu",(unsigned long)self.hash); blockActionDict[[NSString stringWithFormat:@"%lu",(unsigned long)self.hash]] = block; } -(void)whenTouchOne{ UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc]init]; tapGesture.numberOfTouchesRequired = 1; tapGesture.numberOfTapsRequired = 1; [tapGesture addTarget:self action:@selector(tapAction)]; [self addGestureRecognizer:tapGesture]; } -(void)tapAction{ NSLog(@"%lu",(unsigned long)self.hash); actionBlock block = blockActionDict[[NSString stringWithFormat:@"%lu",(unsigned long)self.hash]]; block(); } @end