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()中从用户默认值加载值
和调试以查看发生了什么。Aso
onTapGuesture
可以简化为
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")
      }
    }
    ...