Duc Dang
Duc Dang

Reputation: 186

SwiftUI: How to combine .toggle() not Toggle(isOn..) with UserDefault

Currently I have

@Published var isVisited: Bool {
        didSet{
            UserDefaults.standard.set(isVisited,forKey: "isVisited")
        }
    }
    init() {
        self.isVisited = UserDefaults.standard.object(forKey: "isVisited") as? Bool ?? false
    }
@State private var edit = false
@ObservedObject var userSettings = UserSettings()

Button(action: { self.edit.toggle()}) {
                    if self.edit {
                        Image(systemName: "heart.fill").font(.title)
                    } else {
                        Image(systemName: "heart").font(.title)
                    }
                }.foregroundColor(.red)

Ideally, whenever the "heart" icon is tapped, it will be filled and save data to UserDefault database. I only know the uses of Toggle(isOn:..).

Any suggestions would be much appreciated!

Upvotes: 1

Views: 383

Answers (1)

Daniel Amarante
Daniel Amarante

Reputation: 805

Do you mean something like this?

class UserSettings: ObservableObject {
    init() {
        isVisited = UserDefaults.standard.bool(forKey: "isVisited")
    }

    @Published var isVisited: Bool {
        didSet {
            UserDefaults.standard.set(isVisited, forKey: "isVisited")
        }
    }
}

struct RootView: View {
    @ObservedObject var userSettings = UserSettings()

    var body: some View {
        Button(action: { self.userSettings.isVisited.toggle() }) {
            if self.userSettings.isVisited {
                Image(systemName: "heart.fill").font(.title)
            } else {
                Image(systemName: "heart").font(.title)
            }
        }.foregroundColor(.red)
    }
}

What I did here is that every time UserSettings loads I load isVisited from UserDefaults and then whenever that property is set it updates UserDefaults.

Then on the view instead of using @State to hold the data I'm getting the data directly from UserSettings, since it will have the most updated data.

Upvotes: 1

Related Questions