NSString 和 UITapGestureRecognizer 作为方法参数
Posted
技术标签:
【中文标题】NSString 和 UITapGestureRecognizer 作为方法参数【英文标题】:NSString and UITapGestureRecognizer as method arguments 【发布时间】:2013-08-08 10:07:08 【问题描述】:我想知道如何在 Xcode 中使用 NSString
和 UITapGestureRecoginzer
作为方法参数。
现在我有了这个代码:
-(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两个方法