You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何检测两组UIButton均被点击?现有实现遇问题求替代方案

问题根源先搞清楚

你原来的判断逻辑踩了个坑:isTouchInside这个属性是用来检测当前触摸动作是否正落在按钮范围内的,它只在触摸事件的过程中(比如touchBegan、touchMoved阶段)有效。等IBAction触发的时候,触摸已经结束了,这个值基本都是false,所以你的if条件永远满足不了,自然进不去scrollDown()。

给你两种靠谱的实现方式

方式1:用状态变量直接跟踪(最省心)

不需要搞复杂的代理,直接在当前控制器里用两个变量记录两组的选择状态就行:

  1. 先定义两个私有变量:
private var vehicleHasSelected = false
private var trailerHasSelected = false
  1. 改造你的按钮点击方法:
@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:优化代理模式(如果必须用代理)

如果你的架构要求必须用代理传递事件,那别传按钮实例,传选择状态或者分组类型:

  1. 先修改代理协议:
protocol VehicleTrailerDelegate: AnyObject {
    func didFinishVehicleSelection()
    func didFinishTrailerSelection()
}
  1. 按钮点击里根据分组调用代理:
@IBAction func passOrFailBtnTapped(_ sender: UIButton) {
    if sender == vehiclePassButton || sender == vehicleFailButton {
        delegate?.didFinishVehicleSelection()
    } else {
        delegate?.didFinishTrailerSelection()
    }
}
  1. 在代理实现的类里,同样用状态变量跟踪,然后判断:
// 代理实现类里的代码
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 05:10:34