Тумблеры SwiftUI

Я пытаюсь реализовать простой тумблер, но у меня возникают проблемы с сохранением нового статуса тумблера / переключателя, так как, когда я меняю представления и возвращаюсь в настройку, по умолчанию он возвращается к выключателю. Вы можете сказать мне, что я делаю не так?

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))
        }
      }
    }

1 ответ

Ваш .onTapGesture над Toggle не вызывается, потому что последний не позволяет .simultaneousGesture не поможет)

Вот возможный подход к достижению цели (протестирован с 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")
      }
    }
    ...

Однако я бы рекомендовал связать этот переключатель напрямую с вашим UserSettings соответствующее свойство и обработать синхронизацию с UserDefaults там (например, на didSet).

Другие вопросы по тегам