如何检测两组UIButton均被点击?现有实现遇问题求替代方案
问题根源先搞清楚
你原来的判断逻辑踩了个坑:isTouchInside这个属性是用来检测当前触摸动作是否正落在按钮范围内的,它只在触摸事件的过程中(比如touchBegan、touchMoved阶段)有效。等IBAction触发的时候,触摸已经结束了,这个值基本都是false,所以你的if条件永远满足不了,自然进不去scrollDown()。
给你两种靠谱的实现方式
方式1:用状态变量直接跟踪(最省心)
不需要搞复杂的代理,直接在当前控制器里用两个变量记录两组的选择状态就行:
- 先定义两个私有变量:
private var vehicleHasSelected = false private var trailerHasSelected = false
- 改造你的按钮点击方法:
@IBAction func passOrFailBtnTapped(_ sender: UIButton) { // 先判断点击的是哪一组的按钮,更新对应状态 if sender == vehiclePassButton || sender == vehicleFailButton { vehicleHasSelected = true } else if sender == trailerPassButton || sender == trailerFailButton { trailerHasSelected = true } // 检查两组是否都选完了 if vehicleHasSelected && trailerHasSelected { scrollDown() // 要是下一题需要重新选,记得在这里重置状态 vehicleHasSelected = false trailerHasSelected = false } }
这种方式逻辑直白,代码量也少,完全能满足需求。
方式2:优化代理模式(如果必须用代理)
如果你的架构要求必须用代理传递事件,那别传按钮实例,传选择状态或者分组类型:
- 先修改代理协议:
protocol VehicleTrailerDelegate: AnyObject { func didFinishVehicleSelection() func didFinishTrailerSelection() }
- 按钮点击里根据分组调用代理:
@IBAction func passOrFailBtnTapped(_ sender: UIButton) { if sender == vehiclePassButton || sender == vehicleFailButton { delegate?.didFinishVehicleSelection() } else { delegate?.didFinishTrailerSelection() } }
- 在代理实现的类里,同样用状态变量跟踪,然后判断:
// 代理实现类里的代码 private var vehicleSelected = false private var trailerSelected = false func didFinishVehicleSelection() { vehicleSelected = true checkScrollCondition() } func didFinishTrailerSelection() { trailerSelected = true checkScrollCondition() } private func checkScrollCondition() { if vehicleSelected && trailerSelected { scrollDown() // 重置状态,准备下一题 vehicleSelected = false trailerSelected = false } }
额外小提示
要是你需要给选中的按钮加样式(比如变灰、加边框),可以在点击时设置按钮的isSelected = true,这样后续也能通过isSelected来判断是否已选择,不用额外维护状态变量,一举两得~
内容的提问来源于stack exchange,提问作者Flo
相关产品推荐
相关产品推荐

