Как я могу добавить 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)") } 
  • жест нажатия на uiimage в коллекции
  • Как реализовать UITapGestureRecognizer в моем приложении
  • Форма Xamarin: множественные TapGestureRecognizers не работают на IOS
  • Действие UIBarButtonItem не вызывается, когда в представлении с UIGestureRecognizer
  • IOS: первый ответ не работает сразу после загрузки
  • Как проверить, произошло ли нажатие на место в определенном месте
  • Получите немасштабированную сенсорную точку увеличенного UIWebView
  • MonoTouch - UITapGesture не работает над дочерними элементами управления
  • Почему в shouldReceiveTouch мой распознаватель жестов всегда сообщает, что он прослушивается в том же месте?
  • Жест не работает для меня
  • Как нажать для увеличения и двойного нажатия, чтобы уменьшить масштаб в iOS?
  • Interesting Posts

    Ограничить количество строк в UITextView

    Ячейки статической таблицы в файле NIB

    Как настроить еженедельное повторение UILocalNotifications с изъятиями iOS 8?

    Как получить список друзей Facebook, которые не установили приложение?

    UICollectionView не подчиняется zIndex UICollectionViewLayoutAttributes

    Cocoapods, импортирующие внешнюю структуру

    Вызов метода метаданных ALAssetReprentation несколько сотен раз завершится неудачей

    iOS – изменение размера нескольких изображений с помощью разделителей касания

    Почему Xcode 4.2 использует @autoreleasepool в main.m вместо NSAutoreleasePool?

    Загрузка / загрузка изображения с URL-адреса в Swift

    Нет утечки памяти, но все распределения все увеличиваются

    Как обращаться с приглашениями в игровом центре, если друг не продвинулся достаточно далеко в приложении, чтобы достичь метода installInvitationHandler?

    Как я могу получить фактическую дату и время, если дата и время устройства неточны?

    Как изменить цвет оттенка кнопки очистки на UITextField

    iOS: цвет фона WebView для прозрачного

    Давайте будем гением компьютера.