Swift问题:StackView子视图addGestureRecognizer无响应,需获取视图参数
解决StackView子视图点击手势不触发及获取关联ID的问题
看起来你遇到了两个小麻烦:一是点击StackView里的自定义视图没触发手势方法,二是想拿到点击视图对应的ID。我来一步步帮你搞定:
先解决手势不触发的问题
先排查几个最常见的原因:
- 自定义视图的用户交互没开启:UIView默认
isUserInteractionEnabled是true,但如果你的CategoryClass.createMyClassView()方法里(或者对应的xib/storyboard中)把这个属性关了,手势就不会响应。记得在创建视图后加上这行:view.isUserInteractionEnabled = true - StackView的用户交互被禁用:虽然StackView默认允许交互,但还是确认下
self.stackView.isUserInteractionEnabled是不是true,别被其他代码偷偷改了。 - 视图被遮挡:检查有没有其他视图叠在StackView上面,抢了点击事件。
再实现点击时获取视图的ID
要拿到点击视图的packId,我们可以给自定义视图加个属性来存储这个值,具体步骤:
- 给自定义视图添加packId属性
找到你的CategoryClassView(也就是createMyClassView()返回的视图类),新增一个属性用来保存ID:
class CategoryClassView: UIView { // 保留你原来的控件属性:myLabel、twoLabel、bgCaategory、imgSelect var packId: String? // 可以根据你的实际类型调整,比如Int? }
- 创建视图时绑定packId
在循环创建视图的代码里,把当前的packId赋值给自定义视图的属性:
for ... { let view = CategoryClass.createMyClassView() view.myLabel.text = packTitle view.twoLabel.text = packText view.bgCaategory.layer.cornerRadius = 30 // 新增:给当前视图绑定对应的packId view.packId = packId! i = i + 1 if(i == 1){ selectPackId = packId!; view.imgSelect.image = UIImage(named: "selected") } else { view.imgSelect.image = UIImage(named: "select") } // 确保用户交互开启 view.isUserInteractionEnabled = true view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(handleSendData(sender:)))) self.stackView.addArrangedSubview(view) }
- 在手势方法中获取ID
修改handleSendData方法,通过手势的view属性拿到自定义视图,再取出绑定的packId:
@objc func handleSendData(sender: UITapGestureRecognizer) { print("H 1") // 安全地获取点击的视图和对应的ID guard let tappedView = sender.view as? CategoryClassView, let tappedPackId = tappedView.packId else { print("无法获取点击的视图或ID") return } print("点击的packId是:\(tappedPackId)") // 这里就可以用tappedPackId做你需要的业务逻辑了 }
按照上面的步骤改完,应该就能正常触发手势并拿到对应的ID了。如果还是不行,再检查下自定义视图的布局有没有问题——比如视图的frame是不是为0(不过StackView是自动布局,一般不会出现这种情况),或者子控件有没有意外拦截了点击事件(比如如果视图上有按钮,按钮会优先响应点击)。
内容的提问来源于stack exchange,提问作者salari mameri
相关产品推荐
相关产品推荐

