Objective c NSString和UITapgestureRecognitor作为方法参数

Objective c NSString和UITapgestureRecognitor作为方法参数,objective-c,cocoa-touch,nsstring,uitapgesturerecognizer,Objective C,Cocoa Touch,Nsstring,Uitapgesturerecognizer,我想知道如何使用NSString和uitapgesturererecoginzer作为Xcode中的方法参数。 现在我有了这个代码: -(void)setLanguage:(NSString *)language :(UITapGestureRecognizer *)gesture { gesture.view.alpha = 0.8; [[NSUserDefaults standardUserDefaults] setValue:language forKey:@"GameLa

我想知道如何使用
NSString
uitapgesturererecoginzer
作为Xcode中的方法参数。 现在我有了这个代码:

-(void)setLanguage:(NSString *)language :(UITapGestureRecognizer *)gesture {
    gesture.view.alpha = 0.8;
    [[NSUserDefaults standardUserDefaults] setValue:language forKey:@"GameLanguage"];
}
对于
UITapGestureRecognitor

UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(setLanguage:@"en":tap)];
    [ENImage addGestureRecognizer:tap];

当我这样尝试时,我只会出错。如何解决此问题?

缺少第二个参数的名称
-(void)setLanguage:(NSString*)带有手势的语言:(UITapgestureRecognitizer*)手势是正确的签名

请尝试以下操作:

UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapped:)];
[ENImage addGestureRecognizer:tap];
将手势分配编码替换为以下行

NSString *strLanguage = @"en";
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(setLanguage:strLanguage:)];
[ENImage addGestureRecognizer:tap];
并用以下代码替换setLanguage方法

-(void)setLanguage : (NSString *) language : (id)sender {
    UITapGestureRecognizer *gesture = (UITapGestureRecognizer *) sender;
    gesture.view.alpha = 0.8;
    [[NSUserDefaults standardUserDefaults] setValue:language forKey:@"GameLanguage"];
}

UITapgestureRecognitizer
的操作只能接受一个参数,即本身或无参数。请复习。
我发现您的“语言”是一个常量
NSString
“en”,为什么不试试这个:

UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapped:)];
[ENImage addGestureRecognizer:tap];
在您的
-点击:

- (void)tapped:(UITapGestureRecognizer *)gesture
{
    gesture.view.alpha = 0.8;
    // Or you can call your custom method like [self setLanguage:@"en"]
    [[NSUserDefaults standardUserDefaults] setValue:@"en" forKey:@"GameLanguage"];
}
使用
@selector()
语法时,不能传递参数
@selector
是一个宏,在运行时会在表中搜索与给定签名匹配的方法,所以在括号内传递参数不是一个好主意:-)
你应该使用

@selector(setLanguage::) 
然后,因为这就是手势识别器的制作方式,所以作为动作提供的方法必须接受0或1个参数,而不是更多!如果您的方法接受1个参数,那么将自动传递触发的手势识别器

因此,在您的情况下,如刘耀东所建议的,将您的tapHandling方法更改为

- (void)tapped:(UITapGestureRecognizer *)gesture
在这个方法的主体中,你必须找出语言


干杯,

我该如何在动作选择器中调用它?您可以创建一个简单方便的选择器,如
@selector(imageTapped:)
,带有签名
-(void)imageTapped:(id)sender
,在那里您可以调用您的自定义选择器,或者您可以将其放入我的代码中吗?所以我能理解怎么做。
-(void)imageTapped:(id)sender{[self-setLanguage:@“en”with signature:sender];}
类似的东西应该可以工作
UITapGestureRecognizer*tap=[[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(imageTapped:)];[eImage AddGestureRecognitor:点击]但我希望有2个参数当我使用1个参数时,它可以工作,但当我尝试使用2个参数时,它不起作用。因此,我不能对多个
UITapGestureRecognitizer
使用一个方法。这是:“手势识别器有一个或多个与其关联的目标动作对。如果存在多个目标操作对,则它们是离散的,而不是累积的。识别手势的结果是为每对手势向目标发送动作消息。调用的操作方法必须符合以下签名之一:“
-(void)HandleTesture;”
-(void)HandleTesture:(UIgestureRecognitor*)GestureRecognitor;