Как я могу добавить UITapGestureRecognizer в UILabel внутри ячейки таблицы?

Я использую NIB-файл для компоновки собственной таблицы представления таблицы. Эта ячейка имеет ярлык с выходом, называемым lblName. Добавление идентификатора UITapGestureRecognizer на этот ярлык никогда не запускает связанное событие. У меня есть userInteractionEnabled = YES.

Я предполагаю, что проблема в том, что UILabel находится в TableView и что представление table / cell перехватывает краны. Могу я что-то сделать?

Все, что я хочу сделать, это выполнить некоторые пользовательские действия при нажатии 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]; } 

ПРОСТОЙ СПОСОБ:

Вы также можете использовать невидимую кнопку в верхней части этой метки. Таким образом, это уменьшит вашу работу по добавлению 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]; } } 
 UITapGestureRecognizer *recognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapAction)]; [recognizer setNumberOfTapsRequired:1]; lblName.userInteractionEnabled = YES; [lblName addGestureRecognizer:recognizer]; 

Выполнение этого работает без проблем:

 - (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; .... } } 

даже в случае, когда создается UILabel с IB

Вы можете использовать нижеприведенный код, чтобы добавить жест привязки к UILable в ячейке UITableView

 UITapGestureRecognizer *lblAction = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(lblClick:)]; lblAction.delegate =self; lblAction.numberOfTapsRequired = 1; cell.lbl.userInteractionEnabled = YES; [cell.lbl addGestureRecognizer:lblAction]; 

и для доступа к селекторному методу

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

Для Свифта

 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)") } 

После того, как вы назначаете жестов tap на UILabel и активируете взаимодействие с пользователем, в вашей функции обратного вызова вы можете найти индексный путь из представления ячейки, но просматривая гнездо супервизоров:

 - (UITableViewCell *) findCellInSuperview:(UIView *)view { UITableViewCell *cell = nil; NSString *className = NSStringFromClass([[view superview] class]); if ([className isEqualToString:@"UITableViewCell"]) { cell = (UITableViewCell *)[view superview]; } else { if ([view superview] != nil) { cell = [self findCellInSuperview:[view superview]]; } } return cell; } 

Способ, предложенный Динешем, будет работать без цикла for, используя переменную свойства.

 UITapGestureRecognizer *tap=[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapAction)]; [tap setNumberOfTapsRequired:1]; [self.myUILabel addGestureRecognizer:tap]; 

Вы можете добавить следующий метод -awakeFromNib в своей ячейке

 UITapGestureRecognizer* gesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapGestureRecognizerAction:)]; [self.yourLabel setUserInteractionEnabled:YES]; [self.yourLabel addGestureRecognizer:gesture]; 

Для Swift вы можете добавить это внутри метода cellForRowAtIndexPath.

 var tap = UITapGestureRecognizer(target: self, action: "labelTapped") tap.numberOfTapsRequired = 1 cell.label.addGestureRecognizer(tap) cell.label.tag = indexPath.row 

Затем для действия

 func labelTapped(gesture: UITapGestureRecognizer) { let indexPath = NSIndexPath(forRow: gesture.view!.tag, inSection: 0) let cell = tableView.cellForRowAtIndexPath(indexPath) as UITableViewCell // Do whatever you want. } 

Для Swift 3

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

А потом

 func lblClick(tapGesture:UITapGestureRecognizer){ print("Lable tag is:\(tapGesture.view!.tag)") } 
  • UITapGestureRecognizer не работает для пользовательского подкласса UITextField
  • iOS 9: Распознаватель жестов был настроен в раскадровке / xib для добавления к нескольким представлениям (не работает)
  • Как реализовать UITapGestureRecognizer в моем приложении
  • MpMovieplayerController распознаватель жестов не запускается, когда в полноэкранном режиме
  • Почему в shouldReceiveTouch мой распознаватель жестов всегда сообщает, что он прослушивается в том же месте?
  • UITapGestureRecognizer работает с UIImageView, но не на UILabel
  • shouldReceiveTouch в UITableViewCellContentView
  • Кнопка крана и длинный жест нажатия
  • Как нажать для увеличения и двойного нажатия, чтобы уменьшить масштаб в iOS?
  • tableView скрывается из-за gestureRecognizer, прежде чем он сможет выполнить didSelectRowAtIndexPath
  • как добавить двойной жестов к UITextView
  • Давайте будем гением компьютера.