Подтвердить что ты не робот

Как я могу добавить 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];
}
4b9b3361

Ответ 1

ЛЕГКО ПУТЬ:

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

Ответ 2

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

Ответ 3

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

- (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

Ответ 4

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

Для Swift

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

Ответ 5

После того, как вы назначаете жестов касания на 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;
}

Ответ 6

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

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

Ответ 7

Вы можете добавить следующий элемент в свой метод -awakeFromNib.

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

Ответ 8

Для 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.
}

Ответ 9

Для 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)")
}