SwiftUI:如何将 .toggle() not Toggle(isOn..) 与 UserDefault 结合使用

Posted

技术标签:

【中文标题】SwiftUI:如何将 .toggle() not Toggle(isOn..) 与 UserDefault 结合使用【英文标题】:SwiftUI: How to combine .toggle() not Toggle(isOn..) with 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:..) 的用途。

任何建议将不胜感激!

【问题讨论】:

【参考方案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 的同一个实例共享为环境对象,然后对它的所有更改都会在所有屏幕上发生。

以上是关于SwiftUI:如何将 .toggle() not Toggle(isOn..) 与 UserDefault 结合使用的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法使用 SwiftUI 将选项绑定到 Toggle / Slider

如何在 SwiftUI Toggle 中使用自定义图像

SwiftUI:Toggle详解

已发布值上的 SwiftUI toggle() 函数停止使用 Swift 5.2 触发 didSet

UserDefaults 在 SwiftUI 中与 Toggle 绑定

SwiftUI 中的 Toggle() 运算符可以实现整数吗