首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过委托为另一个类中的手势识别器调用选择器

通过委托为另一个类中的手势识别器调用选择器
EN

Stack Overflow用户
提问于 2014-06-28 12:46:35
回答 1查看 1.5K关注 0票数 1

我有一个自定义视图,它使用一个手势识别器来调用方法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)创建的协议

代码语言:javascript
复制
@protocol CircleViewDelegate <NSObject>
-(void)handleSingleTap:(UITapGestureRecognizer *) tapper;

@end

2)创建委托属性

代码语言:javascript
复制
@property (nonatomic, weak) id <CircleViewDelegate> delegate;

在CircleView 3中)创建带有目标self.delegate的手势识别器

代码语言:javascript
复制
-(void)setUpGestureRecognizers{

    UITapGestureRecognizer *singleFingerTap =
    [[UITapGestureRecognizer alloc] initWithTarget:self.delegate action:@selector(handleSingleTap:)];
    singleFingerTap.numberOfTapsRequired=1;
    [self addGestureRecognizer:singleFingerTap]; 
}

4)在viewController.h中,

代码语言:javascript
复制
   @interface ViewController : UIViewController <UIImagePickerControllerDelegate, UINavigationControllerDelegate, CircleViewDelegate>
    -(void)handleSingleTap:(UITapGestureRecognizer *) tapper;

在viewController.m中

代码语言:javascript
复制
@property (strong, nonatomic) CircleView *overlay;

viewDidLoad

代码语言:javascript
复制
self.overlay.delegate = self;

viewController中的这个方法没有被调用

代码语言:javascript
复制
-(void)handleSingleTap:(UITapGestureRecognizer *) tapper {
     NSLog(@"never getting called");

}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-06-28 13:13:45

这是你的解决方案之一。当然,你也可以用选择器来做,但是这也是肯定的。

.h

代码语言:javascript
复制
#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:

代码语言:javascript
复制
#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中:

代码语言:javascript
复制
#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 ! :) ");
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24466952

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档