Swiftui 快速切换开关
我试图实现一个简单的切换开关,但我在保存新的切换/开关状态时遇到了问题,因为当我更改视图并返回到设置时,它默认返回到关闭开关。你能告诉我我做错了什么吗Swiftui 快速切换开关,swiftui,watchos,Swiftui,Watchos,我试图实现一个简单的切换开关,但我在保存新的切换/开关状态时遇到了问题,因为当我更改视图并返回到设置时,它默认返回到关闭开关。你能告诉我我做错了什么吗 struct StudyMode: View { @State private var overdueFirst = UserDefaults.standard.bool(forKey: "Overdue First") @EnvironmentObject var settings: UserSettings
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))
}
}
}
您的
.ontapsignity
切换开关上的.ontapsignity
未被调用,因为后者不允许(自行处理点击,甚至.simultaneoussignity
也没有帮助)
以下是实现目标的可能方法(使用Xcode 11.2/iOS 13.2进行测试)
。。。
//定义代理绑定,使用UserDefaults包装直接工作
private let overdueFirst=绑定(
get:{UserDefaults.standard.bool(forKey:“过期第一”)},
set:{UserDefaults.standard.set($0,forKey:“过期第一”)})
var body:一些观点{
VStack{
HStack{
切换(isOn:overdueFirst){//直接使用代理绑定
文本(“过期卡优先”)
}
}
...
但是,我建议将此切换直接与您的UserSettings
对应属性绑定,并在那里处理与UserDefaults
的同步(例如,在didSet
)。尝试在onAppear()中从用户默认值加载值
和调试以查看发生了什么。AsoonTapGuesture
可以简化为self.overdueFirst.toggle()
谢谢,这段代码很有效。您介意详细说明最后一段吗?
...
// 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")
}
}
...