Search code examples
swiftuisaveuserdefaultsstepper

SwiftUI Stepper save value


How can I save the value of the stepper in the UserDefaults every time I press + or -?

I don't want a separate save button.

struct Settings: View {
    @State private var zielwert = UserDefaults.standard.integer(forKey: "zielwert")
    
    var body: some View {
        VStack {
            Stepper("Zielwert \(zielwert)", value: $zielwert, in: 90...160)
            Button("Speichern") {
                UserDefaults.standard.set(self.zielwert, forKey: "zielwert")
            }
        }
        .padding(.horizontal, 23.0)
    }
}

Solution

  • iOS 14+

    Use AppStorage:

    struct Settings: View {
        @AppStorage("zielwert") private var zielwert = 90
    
        var body: some View {
            VStack {
                Stepper("Zielwert \(zielwert)", value: $zielwert, in: 90...160)
            }
            .padding(.horizontal, 23.0)
        }
    }
    

    iOS 13+

    Use .onReceive:

    import Combine
    
    struct Settings: View {
        @State private var zielwert = UserDefaults.standard.integer(forKey: "zielwert")
    
        var body: some View {
            VStack {
                Stepper("Zielwert \(zielwert)", value: $zielwert, in: 90...160)
                    .onReceive(Just(zielwert)) { zielwert in
                        print(zielwert)
                        UserDefaults.standard.set(zielwert, forKey: "zielwert")
                    }
            }
            .padding(.horizontal, 23.0)
        }
    }