我有一个自定义视图,它使用一个手势识别器来调用方法handleSingleTap。如果手势识别器和它调用的选择器的设置位于相同的自定义视图(CircleView).However中,那么这很好,我需要viewController中的handleSingleTap方法,所以我(1)在自定义视图(CircleView)中创建了一个协议,(2)在视图中创建了委托属性,当我(3)创建手势识别器时,我为handleSingleTap的目标设置了self.delegate (而不是最初的self )。在viewController.h中,(4)我说它符合协议,并声明了方法handleSingleTap。在视图控制器的.m文件中,我为自定义视图(CircleView)创建了一个属性,然后在.m文件的viewDidLoad中,将self设置为自定义视图的委托。但是,当我点击自定义视图中的圆圈时,handleSingleTap方法永远不会在viewController中被调用。
您能解释为什么选择器handleSingleTap没有在viewController中被调用吗?
1)创建的协议
@protocol CircleViewDelegate <NSObject>
-(void)handleSingleTap:(UITapGestureRecognizer *) tapper;
@end2)创建委托属性
@property (nonatomic, weak) id <CircleViewDelegate> delegate;在CircleView 3中)创建带有目标self.delegate的手势识别器
-(void)setUpGestureRecognizers{
UITapGestureRecognizer *singleFingerTap =
[[UITapGestureRecognizer alloc] initWithTarget:self.delegate action:@selector(handleSingleTap:)];
singleFingerTap.numberOfTapsRequired=1;
[self addGestureRecognizer:singleFingerTap];
}4)在viewController.h中,
@interface ViewController : UIViewController <UIImagePickerControllerDelegate, UINavigationControllerDelegate, CircleViewDelegate>
-(void)handleSingleTap:(UITapGestureRecognizer *) tapper;在viewController.m中
@property (strong, nonatomic) CircleView *overlay;viewDidLoad
self.overlay.delegate = self;viewController中的这个方法没有被调用
-(void)handleSingleTap:(UITapGestureRecognizer *) tapper {
NSLog(@"never getting called");
}发布于 2014-06-28 13:13:45
这是你的解决方案之一。当然,你也可以用选择器来做,但是这也是肯定的。
.h
#import <UIKit/UIKit.h>
@protocol CircleViewDelegate <NSObject>
@required
- (void) circleViewPressedByOneTap;
@end
@interface CircleView : UIView
@property (nonatomic,assign) id<CircleViewDelegate> delegate;
- (id)initWithFrame:(CGRect)frame andWithDelegate:(id<CircleViewDelegate>)del;
@end.m:
#import "CircleView.h"
@interface CircleView () <UIGestureRecognizerDelegate>
@end
@implementation CircleView
@synthesize delegate;
- (id)initWithFrame:(CGRect)frame andWithDelegate:(id<CircleViewDelegate>)del
{
self = [super initWithFrame:frame];
if (self) {
// Initialization code
delegate = del;
[self setUpGestureRecognizers];
}
return self;
}
-(void)setUpGestureRecognizers{
UITapGestureRecognizer *singleFingerTap =
[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTap:)];
singleFingerTap.numberOfTapsRequired=1;
[self addGestureRecognizer:singleFingerTap];
}
-(void)handleSingleTap:(UITapGestureRecognizer *) tapper{
[delegate circleViewPressedByOneTap];
}在你的ViewController .m中:
#import "YouClassViewController.h"
#import "CircleView.h"
@interface YouClassViewController () <CircleViewDelegate>
@end
@implementation YouClassViewController
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view.
CircleView* yourCircleView = [[CircleView alloc] initWithFrame:CGRectMake(0, 0, 50, 50) andWithDelegate:self];
[self.view addSubview:yourCircleView];
}
- (void) circleViewPressedByOneTap{
NSLog(@"Yeaah you pressed it ! :) ");
}https://stackoverflow.com/questions/24466952
复制相似问题