SwiftUI 切换开关 [英] SwiftUI toggle switches

查看:48
本文介绍了SwiftUI 切换开关的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试实现一个简单的切换开关,但我无法保存新的切换/开关状态,因为当我更改视图并返回设置时,它默认返回到关闭开关.你能告诉我我做错了什么吗?

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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆