带有点击手势识别器的 UILabel 不起作用
Posted
技术标签:
【中文标题】带有点击手势识别器的 UILabel 不起作用【英文标题】:UILabel with Tap Gesture Recognizer not working 【发布时间】:2016-08-26 09:59:05 【问题描述】:我使用XIB
设计了一个UICollectionViewCell
,在该自定义单元格中我有一个UILabel
,我已启用其用户交互。
在我设计cell
时,在我的viewcontroller
中,这是我的代码。
UITapGestureRecognizer *buyNowTapped = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(buyNowClicked:)];
buyNowTapped.numberOfTapsRequired = 1.0;
cell.buy.tag = indexPath.row;
cell.buy.userInteractionEnabled = YES;
[cell.buy addGestureRecognizer:buyNowTapped];
-(void)buyNowClicked : (id)sender
UIButton *button;
UILabel *label;
if([sender isKindOfClass:[UIButton class]])
button = (UIButton *)sender;
[self buyService:button.tag];
else if ([sender isKindOfClass:[UILabel class]])
label = (UILabel *)sender;
[self buyService:label.tag];
但是添加的点击手势不起作用。
【问题讨论】:
显示buyNowClicked
函数..
检查buy
标签视图层次结构,查看其他未阻止其userInteraction
的视图
我已经添加了描述
启用用户交互
所以问题是buyNowClicked 永远不会被调用,不是吗?你能在里面放一个 NSLog 以确保它永远不会被调用吗?
【参考方案1】:
使用标签属性创建自定义单元格并使用
-(void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath
NSLog(@"%ld", (long)indexPath.row);
注意:在某处添加了 TapGestureRecognizer,它会阻止选择单元格 didselectitematindexpath
【讨论】:
【参考方案2】:我的建议是重新设计您的设计并将UILabel
更改为UIButton
,因为UIButton
仅处理点击识别,而且您也没有任何点击转发的问题也转发给UICollectionView
(@确实会调用 987654325@)。
所以,用一个按钮更改标签,并在其上的TouchUpInside
事件中设置buyNowClicked:
方法。
更新:如果您因任何原因无法删除 UILabel,则在 UILabel
下放置一个 UIButton
(相同的 frame
和最终 NSConstraints
)并移动 @ 987654332@ 方法在按钮上的TouchUpInside
事件,然后您轻松获胜
【讨论】:
我知道这样比较好,但我有一定的设计限制要这样处理 @AvinashSharma,好的,然后在 UILabel 下放置一个 UIButton(具有相同的框架和最终约束)并在按钮上的 TouchUpInside 事件中移动 buyNowClicked: 方法,然后您轻松获胜:) 是的,这似乎是最简单的方法【参考方案3】:您必须将此代码添加到 Your Custom UICollectionViewCell
类中。
然后创建一个响应点击的委托。
在集合视图的cellForRowAtIndexPath
中分配该委托。
如果您需要详细解释,请告诉我。
编辑 1:代码:
MyCell.swift:
import UIKit
protocol MyCellDelegate
func lblNameTapped(cell: MyCell)
class MyCell: UICollectionViewCell
@IBOutlet var lblName: UILabel!
var lblNameTapRec:UITapGestureRecognizer!
var delegate: MyCellDelegate?
override func awakeFromNib()
super.awakeFromNib()
// Initialization code
lblNameTapRec = UITapGestureRecognizer(target: self, action: #selector(MyCell.lblNameTapped(_:)))
lblName.userInteractionEnabled = true
lblName.addGestureRecognizer(lblNameTapRec)
func lblNameTapped(sender: AnyObject)
delegate?.lblNameTapped(self)
ViewController.Swift:
import UIKit
class WallOfPraizeVC: UIViewController,UICollectionViewDataSource,UICollectionViewDelegate,MyCellDelegate
@IBOutlet var collectionView: UICollectionView!
//DelegateMethod
func lblNameTapped(cell: MyCell)
let indexPath = self.collectionView.indexPathForCell(cell)
print(indexPath!.row)
func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell
let cell = collectionView.dequeueReusableCellWithReuseIdentifier("MyCell", forIndexPath: indexPath) as! MyCell
cell.delegate = self
return cell
【讨论】:
但是我怎么知道标签标签 你想在用户按下标签时打开一些视图控制器吗? 我需要调用一个需要知道被点击的单元格索引的服务。 您之前是否在 Table 中实现过手势识别器和自定义委托? 给我一点时间。【参考方案4】:试试这个:-
-(void)buyNowClicked:(UITapGestureRecognizer*)tap
NSLog(@"buyNowClicked here");
[self buyService:tap.view.tag];
【讨论】:
【参考方案5】:将此代码用于点击手势:-
UITapGestureRecognizer *buyNowTapped = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(buyNowClicked:)];
buyNowTapped.numberOfTapsRequired = 1.0;
cell.buy.tag = indexPath.row;
cell.buy.userInteractionEnabled = YES;
[cell.buy addGestureRecognizer:buyNowTapped];
Try this :
-(void)buyNowClicked : :(UITapGestureRecognizer*)recognizer
UIView *view = [recognizer view];
NSLog(@"tag %ld",(long)view.tag);
UIButton *button;
UILabel *label;
if([view isKindOfClass:[UIButton class]])
button = (UIButton *)sender;
[self buyService:button.tag];
else if ([view isKindOfClass:[UILabel class]])
label = (UILabel *)sender;
[self buyService:label.tag];
【讨论】:
以上是关于带有点击手势识别器的 UILabel 不起作用的主要内容,如果未能解决你的问题,请参考以下文章
Xamarin IOS UILabel在UIScrollView中点击手势不起作用
在 UIPageControl 旁边的 UILabel 上点击手势不起作用