gpt4 book ai didi

ios - 通过委托(delegate)调用另一个类中的手势识别器的选择器

转载 作者:行者123 更新时间:2023-11-29 12:42:41 25 4
gpt4 key购买 nike

我有一个自定义 View ,它使用调用方法 handleSingleTap 的手势识别器。如果手势识别器的设置和它调用的选择器在同一个自定义 View (CircleView) 中,这就可以正常工作。但是,我需要 viewController 中的 handleSingleTap 方法,所以我 (1) 创建了一个自定义 View (CircleView) 中的协议(protocol),(2) 在 View 中创建委托(delegate)属性,当我 (3) 创建手势识别器时,我为 的目标设置了 self.delegate handleSingleTap(而不是最初的 self)。在viewController.h中,(4)我说它符合协议(protocol)并声明了方法handleSingleTap。在 View Controller 的 .m 文件中,我为自定义 View (CircleView) 创建了一个属性,然后在 .m 文件的 viewDidLoad 中,将 self 设置为自定义 View 的委托(delegate)。但是,当我点击自定义 View 中的圆圈时,handleSingleTap 方法永远不会在 viewController 中被调用。

您能解释一下为什么选择器 handleSingleTap 没有在 viewController 中被调用吗?

1) 创建协议(protocol)

@protocol CircleViewDelegate <NSObject>
-(void)handleSingleTap:(UITapGestureRecognizer *) tapper;

@end

2) 创建委托(delegate)属性

@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");

}

最佳答案

这是适合您的一种解决方案。当然,您也可以使用选择器来做到这一点,但这肯定也能奏效。

.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 ! :) ");
}

关于ios - 通过委托(delegate)调用另一个类中的手势识别器的选择器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24466952/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com