SwiftUI / Не получается сохранить Picker таймер
Не получается сохранить выбранное значение таймера, после ухода с View.
Кратко: пользователь попадает на экран, выбирает время таймера, нажимает сохранить, выбранное значение сохраняется в UserDefaults. Далее человек уходит с экрана (через крестик сверху). Когда он возвращается во вью таймера - должно быть последнее выставленное значение из UserDefaults.
Код модельки Таймера:
import SwiftUI
import Combine
class TimerSettings: ObservableObject {
@Published var selectedTime: Int?
init(initialSelectedTime: Int?) {
self.selectedTime = initialSelectedTime
}
//униварсальная функция сохранения
func saveSettings(time: Int, forKey: String) {
UserDefaults.standard.set(time, forKey: forKey)
print(time)
}
//универсальная функция загрузки
func loadSettings(forKey: String) -> Int? {
if let savedSettings = UserDefaults.standard.object(forKey: forKey) as? Int {
selectedTime = savedSettings
return savedSettings
} else {
selectedTime = nil
return nil
}
}
}
Код Вью Таймера:
import SwiftUI
struct TimerView: View {
@StateObject var timerSettings = TimerSettings(initialSelectedTime: nil)
@State var selectedTime = 3
var body: some View {
VStack {
Text("Настройте таймер игры:")
.foregroundStyle(Color(.black).opacity(0.8))
Picker("Время таймера", selection: $selectedTime) {
ForEach(1..<31, id: \.self) {
Text("\($0) мин").tag($0)
}
}.pickerStyle(WheelPickerStyle())
.frame(width: 300, height: 300)
Button("Сохранить") {
timerSettings.saveSettings(time: selectedTime, forKey: "timerSettings")
}
.font(.title)
.foregroundColor(.blue)
.padding(.bottom, 100)
.onAppear {
timerSettings.loadSettings(forKey: "timerSettings")!
}
}
.frame(maxWidth: .infinity, maxHeight: .infinity)
.background(Color(#colorLiteral(red:0.8980392157, green: 0.9333333333, blue: 1, alpha: 1)))
.navigationBarBackButtonHidden(true)
.toolbar {
ToolbarItem(placement: .navigationBarLeading) {
CustomBackButtonView()
}
}
}
}
#Preview {
TimerView()
}