如何在表格视图单元格中的UILabel中添加UITapGestureRecognizer?

Bry*_*yan 23 ios uitapgesturerecognizer

我正在使用NIB文件来布局自定义表格视图单元格.此单元格有一个带有出口的标签,名为lblName.将UITapGestureRecognizer添加到此标签永远不会触发关联的事件.我有userInteractionEnabled = YES.

我猜测问题是UILabel在TableView中并且表/单元视图正在拦截水龙头.我能为此做点什么吗?

我想要做的就是在按下UILabel时执行一些自定义操作!我所见过的所有解决方案都是荒谬的.使用标准工具集应该很容易.但显然不是.

这是我正在使用的代码:

- (void)tapAction {
    NSLog(@"Tap action");
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib

    UITapGestureRecognizer *recognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapAction)]; 
    [recognizer setNumberOfTapsRequired:1];
    //lblName.userInteractionEnabled = true;  (setting this in Interface Builder)
    [lblName addGestureRecognizer:recognizer];
}
Run Code Online (Sandbox Code Playgroud)

Din*_*aja 23

简单的方法:

您也可以使用该标签顶部的隐形按钮.因此,它会减少为该标签添加tapGesture的工作量.

替代方式:

您不应该为此创建IBOutlet UILabel.执行此操作时,您将在自定义类实现文件中添加插座.您无法访问其他文件.因此,在自定义类中为该标签设置标记,IB并在cellForRowAtIndexPath:方法中编写代码.

更新:

cellForRowAtIndexPath:方法中,

for(UIView *view in cell.contentViews.subviews) {
    if(view.tag == 1) {
        UITapGestureRecognizer *tap=[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapAction)];
        [tap setNumberOfTapsRequired:1];
        [view addGestureRecognizer:tap];
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 在我在单元格本身设置"User Interaction Enabled"之前,这对我不起作用 (4认同)

小智 14

UITapGestureRecognizer *recognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapAction)]; 
[recognizer setNumberOfTapsRequired:1];
lblName.userInteractionEnabled = YES;  
[lblName addGestureRecognizer:recognizer];
Run Code Online (Sandbox Code Playgroud)


Whi*_*ger 10

这样做没有问题:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{
   ...
   // create you cell
   UILabel *lbl = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 100, 50)];
   [lbl setText:@"example"];
   [lbl setUserInteractionEnabled:YES];
   [cell.contentView addSubview:lbl];
   UITapGestureRecognizer *tap=[[UITapGestureRecognizer alloc] initWithTarget:self    action:@selector(tapAction:)];
   tap.tag = [NSIndexPath row];
   [tap setNumberOfTapsRequired:1];
   [lbl addGestureRecognizer:tap];
   ... 
}

- (void)tapAction:(id)sender {
  switch(((UITapGestureRecognizer *)sender).view.tag) {
     case 0:
          // code
          break;
     case 1:
         // code
         break;
      ....
     }
}
Run Code Online (Sandbox Code Playgroud)

即使在使用IB创建UILabel的情况下也是如此

  • 如果我理解了,你想要在单击一个单元格时执行某个动作,点击一下吧?因此,一个想法可能是为每个单元格(其中的标签)设置tapGesture事件,以指定与单元格编号对应的标记,因此当您单击标签时,您确切地知道您在basandoti上单击标记的单元格.然后你可以用更复杂的方式管理它,但这仍然是你问题的起点. (2认同)

Har*_*kar 7

您可以使用以下代码在UITableView单元格中的UILable上添加点按手势

UITapGestureRecognizer *tapGeature = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(lblClick:)];
tapGeature.delegate =self;
tapGeature.numberOfTapsRequired = 1;

cell.lbl.userInteractionEnabled = YES;
[cell.lbl addGestureRecognizer:tapGeature];
Run Code Online (Sandbox Code Playgroud)

并访问选择器方法

- (void)lblClick:(UITapGestureRecognizer *)tapGesture {
    UILabel *label = (UILabel *)tapGesture.view;
    NSLog(@"Lable tag is ::%ld",(long)label.tag);
}
Run Code Online (Sandbox Code Playgroud)

对于斯威夫特

let tapGesture : UITapGestureRecognizer = UITapGestureRecognizer.init(target: self, action: #selector(lblClick(tapGesture:)))
tapGesture.delegate = self
tapGesture.numberOfTapsRequired = 1
cell.lbl.userInteractionEnabled = true
cell.lbl.tag = indexPath.row
cell.lbl.addGestureRecognizer(tapGesture)

func lblClick(tapGesture:UITapGestureRecognizer){
   print("Lable tag is:\(tapGesture.view!.tag)")
}
Run Code Online (Sandbox Code Playgroud)


mob*_*ppz 5

基于 Hardik Thakkar 的解决方案,使用 Swift 5 进行 2019 年更新。要检测单元格中 UIlabel 上的点击,请在下面的视图控制器中找到 cellForRowAt 方法。

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {}
Run Code Online (Sandbox Code Playgroud)

返回单元格之前,将以下代码放入上述方法中:

let tapGesture : UITapGestureRecognizer = UITapGestureRecognizer.init(target: self, action: #selector(labelTap(tapGesture:)))
tapGesture.delegate = self
tapGesture.numberOfTapsRequired = 1
cell.yourLabel.isUserInteractionEnabled = true
cell.yourLabel.tag = indexPath.row
cell.yourLabel.addGestureRecognizer(tapGesture)            
return cell
Run Code Online (Sandbox Code Playgroud)

向视图控制器添加一个方法来处理点击:

@objc func labelTap(tapGesture:UITapGestureRecognizer){
    print("Label tag is:\(tapGesture.view!.tag)")
}
Run Code Online (Sandbox Code Playgroud)