Как я могу добавить 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];
}
Ответы
Ответ 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)")
}