SwiftUI 切换开关 [英] SwiftUI toggle switches
问题描述
我正在尝试实现一个简单的切换开关,但我无法保存新的切换/开关状态,因为当我更改视图并返回设置时,它默认返回到关闭开关.你能告诉我我做错了什么吗?
I'm trying to implement a simple toggle switch but I'm having trouble saving the new toggle/switch status as when I change views and go back into the setting, it's defaulted back to the off switch. Can you tell me what I'm doing wrong?
struct StudyMode: View {
@State private var overdueFirst = UserDefaults.standard.bool(forKey: "Overdue First")
@EnvironmentObject var settings: UserSettings
var body: some View {
VStack {
HStack {
Toggle(isOn: $overdueFirst) {
Text("Overdue cards first")
}
.onTapGesture {
var newSwitch = false
if self.overdueFirst == false {
newSwitch = true
}
UserDefaults.standard.set(newSwitch, forKey: "Overdue First")
}
}
Spacer()
Text("By enabling this option, the cards will be ordered such that you will revise all overdue cards before you start learning new words.")
.font(.system(size: 12))
}
}
}
推荐答案
Your .onTapGesture
over Toggle
没有被调用,因为后者不允许(处理 tap by本身,甚至 .simultaneousGesture
也无济于事)
Your .onTapGesture
over Toggle
is not called, because latter does not allow it (handling tap by itself, and even .simultaneousGesture
will not help)
这是实现目标的可能方法(使用 Xcode 11.2/iOS 13.2 测试)
Here is possible approach to achieve the goal (tested with Xcode 11.2 / iOS 13.2)
...
// define proxy binding, wrapping direct work with UserDefaults
private let overdueFirst = Binding<Bool>(
get: { UserDefaults.standard.bool(forKey: "Overdue First") },
set: { UserDefaults.standard.set($0, forKey: "Overdue First") })
var body: some View {
VStack {
HStack {
Toggle(isOn: overdueFirst) { // use proxy binding directly
Text("Overdue cards first")
}
}
...
但是,我建议将此 Toggle 直接与您的 UserSettings
相应属性绑定,并在那里处理与 UserDefaults
的同步(例如,在 didSet
上).
However I would recommend to bind this Toggle directly with your UserSettings
corresponding property and handle sync with UserDefaults
there (eg. on didSet
).
这篇关于SwiftUI 切换开关的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!