我的视图有 3 个开关和 1 个按钮。一开始,所有开关都是假的,你只能将一个开关设为真。此外,该按钮仅在
customOption
和 newCustomOption
之间存在差异时才起作用。
在 4 种可能的情况下,只有 2 种适用于我当前的代码:
1- 首先打开所有开关
false
,打开一个 true
并确认。好的
2- 您一开始只打开一个开关
true
,使其 false
并确认。好的
3- 首先将所有开关打开
false
,制作一个 true
,制作另一个 true
,然后您会得到 None
,而不是对应的值。不行
4- 与 3 类似,但您已经打开了一个开关
true
。不行
我发现了问题:在获得正确的值后,
newCustomOption
设置为None
,而不是相反,但我不知道如何解决它。有什么想法吗?
import SwiftUI
struct ExampleView: View {
@Environment(\.dismiss) private var dismiss
@AppStorage("customOption") private var customOption = "None"
@State private var newCustomOption = "None"
@State private var optionOne = false
@State private var optionTwo = false
@State private var optionThree = false
var body: some View {
VStack {
Toggle("Option One", isOn: $optionOne)
.onAppear { load() }
.onChange(of: optionOne) { _ in
newCustomOption = optionOne ? "optionOne" : "None"
print(newCustomOption)
if optionOne {
optionTwo = false
optionThree = false
}
}
Toggle("Option Two", isOn: $optionTwo)
.onChange(of: optionTwo) { _ in
newCustomOption = optionTwo ? "optionTwo" : "None"
print(newCustomOption)
if optionTwo {
optionOne = false
optionThree = false
}
}
Toggle("Option Three", isOn: $optionThree)
.onChange(of: optionThree) { _ in
newCustomOption = optionThree ? "optionThree" : "None"
print(newCustomOption)
if optionThree {
optionOne = false
optionTwo = false
}
}
Button("Confirm", action: { confirm() })
.opacity(customOption == newCustomOption ? 0.5 : 1)
.disabled((customOption == newCustomOption ? true : false))
}
}
private func load() {
newCustomOption = customOption
switch newCustomOption {
case "optionOne":
optionOne = true
case "optionTwo":
optionTwo = true
case "optionThree":
optionThree = true
default /* "None" */:
return
}
}
private func confirm() {
customOption = newCustomOption
dismiss()
}
}
提前谢谢!
我建议您使用
Picker
并将其样式设置为单选按钮组,它将需要更少的代码和更简单的逻辑
struct ExampleView: View {
@Environment(\.dismiss) private var dismiss
@AppStorage("customOption") private var customOption = "None"
var body: some View {
VStack {
Picker(selection: $customOption, label: Text("Option:")) {
Text("One").tag("optionOne")
Text("Two").tag("optionTwo")
Text("Three").tag("optionThree")
Text("None").tag("None")
}.pickerStyle(RadioGroupPickerStyle())
Button("Dismiss") { dismiss() }
}
}
}
下一步是使用枚举来保存不同的选项。