【问题标题】:SwiftUI: How to combine .toggle() not Toggle(isOn..) with UserDefaultSwiftUI:如何将 .toggle() not Toggle(isOn..) 与 UserDefault 结合使用
【发布时间】:2020-08-11 20:41:19
【问题描述】:

目前我有

@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:..) 的用途。

任何建议将不胜感激!

【问题讨论】:

    标签: swiftui toggle userdefaults


    【解决方案1】:

    你的意思是这样的吗?

    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 获取数据,因为它将拥有最新的数据。

    【讨论】:

    • 哇!!我做了同样的事情,但没有成功,也许我留下了 $ like self.$userSettings.isVisited.toggle() !非常感谢@Daniel Amarante
    • 您可以删除 init 并执行以下操作:@Published var isVisited = UserDefaults.standard.bool(forKey: "isVisited") { ... }
    • 顺便问一下@Daniel Amarante 和@pawello2222,如果我想将保存的数据显示到另一个视图,那么该怎么做呢?我真的不想只为这个人使用 CoreData
    • @DucDang 这是另一个问题 :) 请创建一个新帖子并在那里描述您的问题。
    • @DucDang 您可以将UserSettings 的同一个实例共享为环境对象,然后对它的所有更改都会在所有屏幕上发生。
    猜你喜欢
    • 1970-01-01
    • 2010-10-13
    • 2019-11-11
    • 2020-11-06
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多