SwiftUI:如何将.toggle而不是ToggleisOn ..与UserDefault组合

问题描述

我现在有

@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)

理想情况下,每当点击“心脏”图标时,它将被填充并将数据保存到UserDefault数据库。我只知道Toggle(isOn:..)的用途。

任何建议将不胜感激!

解决方法

你的意思是这样吗?

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)
    }
}

我在这里所做的是,每次加载UserSettings时,我都会从UserDefaults加载isVisited,然后只要设置了该属性,它就会更新UserDefaults

然后在视图上,而不是使用@State来保存数据,我直接从UserSettings获取数据,因为它将拥有最新的数据。