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

SwiftUI List中实现单选按钮默认未选中、点击仅选中项状态变更问题

问题根源

你当前的代码里imageName是整个ListView共用的全局状态,所有单选按钮都读取同一个状态值,修改后自然所有按钮同步变更。单选逻辑不应该存储全局的图片名称,而是存储当前选中的选项唯一标识。

修正后代码

struct ListView: View {
    // 存储当前选中的选项ID,默认nil代表无选中
    @State private var selectedChoiceId: String?
    // 注意:如果你的ChoiceId是Int类型,上面声明改成 @State private var selectedChoiceId: Int?

    var body: some View {
        List(vwModel.OpnChoice.ItemList) { opn in
            VStack(alignment:.leading) {
                ForEach(opn.Choices.indices, id: \.self) { row in
                    let currentChoice = opn.Choices[row]
                    Button(action: {
                        print("\(currentChoice.ChoiceId)")
                        // 点击时更新选中ID,要取消选中的话就替换为下行注释里的逻辑
                        selectedChoiceId = currentChoice.ChoiceId
                        // 支持取消选中的逻辑:selectedChoiceId = selectedChoiceId == currentChoice.ChoiceId ? nil : currentChoice.ChoiceId
                    }) {
                        // 动态判断当前选项是否是选中状态,加载对应图片
                        Image(selectedChoiceId == currentChoice.ChoiceId ? "radio-On" : "radio-off")
                            .renderingMode(.original)
                            .resizable()
                            .aspectRatio(contentMode: .fill)
                            .frame(width: 30, height: 30)           
                    }
                    Text(currentChoice.ChoiceName)   
                }
            }
        }
    }
}

补充说明

  • 默认状态下selectedChoiceId为nil,所有选项都显示未选中状态,符合需求。
  • 每个选项仅在自身ID和当前选中ID匹配时显示选中态的图片,不会出现所有按钮同步变更的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 23:24:03