我正在使用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];
}
答案 0 :(得分:23)
方便:
您也可以在该标签的顶部使用隐形按钮。因此,它会减少为该标签添加tapGesture的工作量。
替代方式:
您不应为UILabel
创建IBOutlet。执行此操作时,您将在自定义类实现文件中添加插座。您无法访问其他文件。因此,在自定义类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];
}
}
答案 1 :(得分:13)
UITapGestureRecognizer *recognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapAction)];
[recognizer setNumberOfTapsRequired:1];
lblName.userInteractionEnabled = YES;
[lblName addGestureRecognizer:recognizer];
答案 2 :(得分: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;
....
}
}
即使在使用IB
创建UILabel的情况下也是如此答案 3 :(得分: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];
并访问选择器方法
- (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)")
}
答案 4 :(得分:2)
基于Hardik Thakkar解决方案的Swift 5于2019年更新。要检测单元格中UIlabel上的轻击,请在下面的视图控制器中找到cellForRowAt方法。
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {}
在返回单元格之前,将以下代码放入上述方法中:
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
在视图控制器中添加一种方法来处理水龙头:
@objc func labelTap(tapGesture:UITapGestureRecognizer){
print("Label tag is:\(tapGesture.view!.tag)")
}
答案 5 :(得分:1)
将点击手势分配给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 :(得分:1)
对于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)")
}
答案 7 :(得分:0)
Dinesh提出的方式将在没有使用属性变量的for循环的情况下工作。
UITapGestureRecognizer *tap=[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapAction)];
[tap setNumberOfTapsRequired:1];
[self.myUILabel addGestureRecognizer:tap];
答案 8 :(得分:0)
您可以在单元格的-awakeFromNib方法中添加下一个
UITapGestureRecognizer* gesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapGestureRecognizerAction:)];
[self.yourLabel setUserInteractionEnabled:YES];
[self.yourLabel addGestureRecognizer:gesture];
答案 9 :(得分:0)
对于斯威夫特来说, 你可以在你的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.
}