我想要实现的是:当我点击特定的UIImageView时,UITapGesture会将一个字符串传递给tap方法。
我的代码如下:想象一下我已经有了一个UIImageView对象,当我点击这个图像时,它会打个电话,
UITapGestureRecognizer *tapFirstGuy = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(makeCallToThisPerson:@"1234567")];
[imageViewOne addGestureRecognizer:tapFirstGuy];
- (void)makeCallToThisPerson:(NSString *)phoneNumber
{
NSString *phoneNum = [NSString stringWithFormat:@"tel:%@", phoneNumber];
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:phoneNum]];
}
但是,我收到以下编译错误:@selector(makeCallToThisPerson:@"1234567");
我无法弄清楚发生了什么。为什么我不能将字符串传递给私有方法?
答案 0 :(得分:3)
这是错误的,它不是有效的选择器。
UITapGestureRecognizer *tapFirstGuy = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(makeCallToThisPerson:@"1234567")];
您需要更改为:
UITapGestureRecognizer *tapFirstGuy = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(makeCallToThisPerson:)];
在你的方法中,参数将是tapGesture,即它:
- (void)makeCallToThisPerson:(UITapGestureRecognizer *)tapGesture
你可以做几件事,以便传递一个参数:
1.-使用imageView的de标签,tapGesture知道视图而不是它附加的你可以使用标签视图:
UITapGestureRecognizer *tapFirstGuy = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(makeCallToThisPerson:)];
imageViewOne.tag = 1234567
[imageViewOne addGestureRecognizer:tapFirstGuy];
- (void)makeCallToThisPerson:(UITapGestureRecognizer *)tapGesture
{
NSString *phoneNum = [NSString stringWithFormat:@"tel:%ld",tapGesture.view.tag];
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:phoneNum]];
}
其他选项,子类化以将NSString作为新属性附加到imageView。
答案 1 :(得分:3)
您可以尝试编写UITapGestureRecognizer
的子类,如下所示: -
@interface customTapGestureRecognizer : UITapGestureRecognizer
@property (nonatomic, strong) NSString * phoneNumber;
@end
// customTapGestureRecognizer.m
@implementation customTapGestureRecognizer
@end
// =====================
....
customTapGestureRecognizer *singleTap = [[customTapGestureRecognizer alloc] initWithTarget:self action:@selector(makeCallToThisPerson:)];
singleTap.phoneNumber = @"1234567";
-(void) makeCallToThisPerson:(UITapGestureRecognizer *)tapRecognizer {
customTapGestureRecognizer *tap = (customTapGestureRecognizer *)tapRecognizer;
NSLog(@"phoneNumber : %@", tap.phoneNumber);
}
注意: - 编写子类的好处是,您可以在UITapGestureRecognizer
轻松传递更多数据。
答案 2 :(得分:1)
@ OnikIV使用标签的建议如果要传递的值是整数,则可以正常工作。
如果你想传递一个字符串,那么它就不会很好。
您可以将标记设置为唯一值,然后在手势识别器的操作方法中,将标记值转换为NSNumber并将其用作在电话号码字典中查找值的键。
另一个选择是使用关联存储将字符串附加到图像视图。关联存储是一种允许您将键/值对附加到任意NSObject的技术。
我在github上有一个名为AssociativeStorageDemo的示例项目,它展示了如何使用它。
答案 3 :(得分:0)
操作应该只是一个方法的选择器,该方法的签名必须是"方法,它接受一个 id 参数并返回 void &#34 ;. id 参数(通常)是发送消息的对象。
目标(发送操作的对象)可以使用 sender 参数在需要时提取其他信息,但是需要提供信息。它没有免费提供。
也就是说,您的ImageView子类可能包含以下方法:
- (void)setPhoneNumber:(NSString *)phoneNumber; // set a phoneNumber property
- (void)prepareToBeTapped
{
UITapGestureRecognizer *tapFirstGuy = [[UITapGestureRecognizer alloc]
initWithTarget:self action:@selector(makeCallToThisPerson:)];
[self addGestureRecognizer:tapFirstGuy];
}
- (void)makeCallToThisPerson:(id)sender
{
NSString *phoneURL = [NSString stringWithFormat:@"tel:%@", phoneNumber];
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:phoneURL]];
}
也就是说,它不是动作,甚至不知道电话号码的UITapGestureRecognizer
。目标必须以其他方式知道(或能够获得)电话号码,或许将其作为可设置的财产。