NSString 和 UITapGestureRecognizer 作为方法参数

Posted

技术标签:

【中文标题】NSString 和 UITapGestureRecognizer 作为方法参数【英文标题】:NSString and UITapGestureRecognizer as method arguments 【发布时间】:2013-08-08 10:07:08 【问题描述】:

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

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

这是UITapGestureRecognizer

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

当我以这种方式尝试时,我只会得到错误。我该如何解决这个问题?

【问题讨论】:

【参考方案1】:

UITapGestureRecognizer的动作只能带一个参数,可以是自身也可以不带参数。请查看this question。 我发现你的“语言”是一个常量NSString“en”,为什么不试试这个:

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

在你的-tapped:

- (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"];

【讨论】:

所以我不能对多个UITapGestureRecognizer 使用一种方法? 这是the document:"一个手势识别器有一个或多个与之关联的目标-动作对。如果有多个目标-动作对,它们是离散的,而不是累积的。识别一个手势会导致将操作消息发送到每个对的目标。调用的操作方法必须符合以下签名之一:" - (void)handleGesture; - (void)handleGesture:(UIGestureRecognizer *)gestureRecognizer;【参考方案2】:

您缺少第二个参数的名称 -(void) setLanguage:(NSString *)language withGesture:(UITapGestureRecognizer *)gesture 是正确的签名

【讨论】:

我如何在动作选择器中调用它? 您可以创建一个简单的便利选择器,例如带有签名 @selector(imageTapped:)-(void)imageTapped:(id)sender,然后您可以调用您的自定义选择器 你能把它放在我的代码里吗?所以我可以理解如何做到这一点。 -(void)imageTapped:(id)sender [self setLanguage:@"en" withGesture:sender]; 这样的东西应该可以工作 UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(imageTapped:)]; [ENImage addGestureRecognizer:tap];【参考方案3】:

试试这个:

用以下几行替换您的手势分配编码

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"];

【讨论】:

但我想要两个参数 当我使用 1 个参数时它可以工作,但是当我尝试使用 2 时它不起作用【参考方案4】:
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(setLanguage:@"en":tap)]

使用@selector() 语法时,不能传递参数。 @selector 是一个宏,它将在运行时跨表搜索与给定签名匹配的方法,因此在括号内传递参数不是一个好主意 :-) 你应该使用

@selector(setLanguage::) 

然后,因为UIGesture Recognizers 是这样制作的,所以您作为操作提供的方法必须接受 0 或 1 个参数,不能更多!如果您的方法接受 1 个参数,则自动将其传递给触发的手势识别器。

因此,在您的情况下,就像刘耀东建议的那样,将您的 tapHandling 方法更改为类似

- (void)tapped:(UITapGestureRecognizer *)gesture

在这个方法的主体中,你必须弄清楚语言。

干杯,

【讨论】:

以上是关于NSString 和 UITapGestureRecognizer 作为方法参数的主要内容,如果未能解决你的问题,请参考以下文章

NSString 到 CFStringRef 和 CFStringRef 到 ARC 中的 NSString?

探讨NSString和NSMutableString的内存问题以及copy和MutableCopy两个方法

NSString 和 NSMutableString

iOS如何判断屏幕是不是被点击

NSString 和 UITapGestureRecognizer 作为方法参数

NSString跟SwiftString的区别和使用场景