【OC】給UIView、UILabel、UIImageView等等繼承UIView的控制元件新增點選功能
阿新 • • 發佈:2019-01-06
#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