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

SwiftUI点击按钮后选中项未显示对勾图标问题求助

问题分析与解决方案

核心原因:视图未触发刷新

你的viewModel.isSelected大概率没有正确触发SwiftUI的视图更新机制,导致即使数据正确,UI也不会同步变化。

检查ViewModel代码必须满足两个条件:

  1. 遵循ObservableObject协议
  2. isSelected属性用@Published修饰,且修改字典时要让SwiftUI感知到变化

正确的ViewModel示例:

class YourViewModel: ObservableObject {
    // 用@Published修饰,确保数据变化时通知视图刷新
    @Published var isSelected: [String: Set<String>] = [:]

    func addEquipment(exerciseID: String, equipmentName: String) {
        // 注意:不能直接修改字典内的Set(比如selectedSet.insert(...)),必须重新赋值条目
        if var selectedSet = isSelected[exerciseID] {
            if selectedSet.contains(equipmentName) {
                selectedSet.remove(equipmentName)
            } else {
                selectedSet.insert(equipmentName)
            }
            isSelected[exerciseID] = selectedSet
        } else {
            isSelected[exerciseID] = [equipmentName]
        }
    }
}

为什么要重新赋值?因为@Published只会在字典本身的引用变化时触发刷新,直接修改内部的Set不会触发更新。

次要排查点

  1. 键的有效性:确保exercise.id ?? ""不会是空字符串,否则所有设备会共享同一个空键,可能导致判断逻辑混乱。如果exercise.id可能为空,建议用UUID().uuidString作为兜底的唯一标识。
  2. 布局验证:可以临时给包含对勾的HStack加红色边框,确认对勾是否被Spacer挤到不可见区域:
    HStack {
        Text(equipmentName)
            .foregroundColor(.white)
        Spacer()
        if let isSelected = viewModel.isSelected[exercise.id ?? ""], isSelected.contains(equipmentName) {
            Image(systemName: "checkmark")
                .foregroundColor(.white)
        }
    }
    .border(.red) // 临时添加边框验证布局
    

内容的提问来源于stack exchange,提问作者SLAC

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 14:28:15