Objective-C:将字符串参数传递给tapgesture @selector

时间:2014-12-07 23:01:48

标签: ios objective-c selector uigesturerecognizer gesture

我想要实现的是:当我点击特定的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");

我无法弄清楚发生了什么。为什么我不能将字符串传递给私有方法?

4 个答案:

答案 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。目标必须以其他方式知道(或能够获得)电话号码,或许将其作为可设置的财产。