[UITapGestureRecognizer tag]: 无法识别的选择器发送到实例

13

我正在排列一系列的imageview,并给它们分配一个TapView识别器

UITapGestureRecognizer *tapRecognizer = [[UITapGestureRecognizer alloc]
                                         initWithTarget:self action:@selector(action:)];
[tapRecognizer setNumberOfTouchesRequired:1];
[tapRecognizer setDelegate:self];
imageView.userInteractionEnabled = YES;
[imageView addGestureRecognizer:tapRecognizer];

我已经定义了选择器为:

-(void) action:(id)sender
  {
    NSLog(@"TESTING TAP");
    NSLog (@"%d",[sender tag]);
  }

我的程序崩溃了,出现了以下错误信息:

[UITapGestureRecognizer tag]: unrecognized selector sent to instance 0x145d0210

5个回答

38
你可以使用这个...
UITapGestureRecognizer *tapRecognizer = [[UITapGestureRecognizer alloc]
                                         initWithTarget:self action:@selector(action:)];
[tapRecognizer setNumberOfTouchesRequired:1];
[tapRecognizer setDelegate:self];
imageView.userInteractionEnabled = YES;
imageView.tag = 1111;
[imageView addGestureRecognizer:tapRecognizer];

接下来让我们动起来试一试...

-(void) action:(id)sender
  {
    NSLog(@"TESTING TAP");
    UITapGestureRecognizer *tapRecognizer = (UITapGestureRecognizer *)sender;
    NSLog (@"%d",[tapRecognizer.view tag]);
  }

说明:

UITapGestureRecognizer没有像tag一样的属性。但是它有view属性,通过这个属性,您可以访问附加了UITapGestureRecognizer的视图。

希望这能帮到您。


欢迎,如有需要请随时寻求帮助。请接受答案,以便其他用户可以从您的帖子中获得帮助。 - Nirav Gadhiya
1
请问 Swift 的等效语句是什么?@NiravGadhiya - iOS Developer

10

只需使用以下选择器方法进行更改...它就会起作用

tapgesture将具有被点击的整个视图..然后,您可以像我在下面所述的那样从中获取标记属性

-(void)action:(UITapGestureRecognizer *)tapGesture{

     NSLog(@"TESTING TAP");
        NSLog (@"%d",tapGesture.view.tag);

    }

7

既然 UITapGestureRecognizerUIGestureRecognizer 都没有声明名为 tag 的属性或方法,因此你不能使用它。这就是为什么会出现错误的原因。

顺便说一下,我真的不喜欢通常情况下使用 tag。总有更好的方法来完成你要做的事情而不必使用 tag


@Wodjefer,您使用“tag”是为了做什么?也就是说,您为什么要使用它?如果我知道,我可能会建议更好的方法。 - Fogmeister
实际上,我有一系列排列的ImageView,当它们在滚动时,我应该能够得到预览,就像iPhone相册(iOS7)中的预览一样。 - Wodjefer
2
啊,iPhone 的照片应用程序使用 UICollectionView 来布局图像。它的工作方式很像 UITableView,并且可以为您完成所有的点击操作。这样,您就不需要 UITapGestureRecognizer 了,同时在同一时间内显示所有照片的内存效率也更高。 - Fogmeister
我建议看一下这个教程...http://www.raywenderlich.com/22324/beginning-uicollectionview-in-ios-6-part-12 - Fogmeister

5

接受答案的Swift等效代码:

//use this to set up your tap gesture
let tapGesture = UITapGestureRecognizer(target: self, action: #selector(self.reactToTap(sender:)))
imageView.tag = 33
imageView.isUserInteractionEnabled = true
imageView.addGestureRecognizer(tapGesture)

这是由轻拍触发的函数:
@objc private func reactToTap(sender: UITapGestureRecognizer) {
            
    print("ImageView tag: ", sender.view?.tag ?? 0) //"ImageView tag: 33"
}

这个可行!我已经寻找Swift的解决方案很久了,谢谢! - Jan L
对于任何正在寻找解决方案的人,请不要将发送者视为一个视角。使用这个解决方案,它会起作用的。谢谢! - Mr. T.

3

您不能直接获取UITapGestureRecognizertag属性,而是需要获取其视图的属性。

您可以尝试以下代码:

-(void)action:(id)sender
  {
     NSLog(@"TESTING TAP");
     NSLog (@"%d",[[sender view]tag]);

  }

非常感谢这个。其他方法对我没有用! - shrishaster

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接