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

SwiftUI实现互斥Toggle复选框:无需模型布尔值

SwiftUI实现互斥Toggle(无需模型布尔值)

当然可以不用在模型里定义布尔值,直接在View内部用本地状态就能搞定互斥选择。核心思路是用单个状态变量跟踪当前选中的选项,而不是给每个Toggle单独设布尔值,这样天然就能保证互斥。

假设你的自定义CheckboxToggleStyle是这样的(保留你原来的实现即可):

struct CheckboxToggleStyle: ToggleStyle {
    func makeBody(configuration: Configuration) -> some View {
        Button(action: {
            configuration.isOn.toggle()
        }) {
            HStack {
                Image(systemName: configuration.isOn ? "checkmark.square.fill" : "square")
                configuration.label
            }
        }
    }
}

修改你的OrderView,用一个可选值状态来控制选中项:

struct OrderView: View {
    // 用这个变量跟踪当前选中的选项,可选值表示可以都不选
    @State private var selectedOption: String?
    
    var body: some View {
        VStack(spacing: 16) {
            // 第一个Toggle:绑定到selectedOption是否等于"option1"
            Toggle("选项1", isOn: Binding(
                get: { selectedOption == "option1" },
                set: { isOn in
                    if isOn {
                        selectedOption = "option1"
                    } else {
                        selectedOption = nil
                    }
                }
            ))
            .toggleStyle(CheckboxToggleStyle())
            
            // 第二个Toggle:绑定到selectedOption是否等于"option2"
            Toggle("选项2", isOn: Binding(
                get: { selectedOption == "option2" },
                set: { isOn in
                    if isOn {
                        selectedOption = "option2"
                    } else {
                        selectedOption = nil
                    }
                }
            ))
            .toggleStyle(CheckboxToggleStyle())
        }
        .padding()
    }
}

原理说明:

  • 用@State private var selectedOption: String?来记录当前选中的是"option1"、"option2"还是都不选(nil)
  • 每个Toggle的isOn绑定不是直接用布尔值,而是通过Binding构造器,把选中状态和selectedOption关联起来:
    • get方法:判断当前选项是否是选中的那个
    • set方法:如果用户勾选,就把selectedOption设为当前选项的标识;如果取消勾选,就清空选中状态
  • 这样选中其中一个时,selectedOption会被更新,另一个Toggle的get方法就会返回false,自动取消选中

如果需要强制必须选一个(不能都不选),可以把selectedOption设为非可选的,初始值设为其中一个选项,比如:

@State private var selectedOption: String = "option1"

然后修改Toggle的set方法,取消勾选时不设为nil,而是保持当前选中项(或者改成选另一个,根据需求调整)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 08:55:53