SwiftUI тумблеры - PullRequest
       5

SwiftUI тумблеры

0 голосов
/ 03 марта 2020

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

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 Ответ

0 голосов
/ 03 марта 2020

Ваш .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 и обрабатывать syn c с UserDefaults там (например, на didSet).

...