Reputation: 186
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
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