Тумблеры 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
).