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
相关产品推荐
相关产品推荐

