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() 函数停止使用 Swift 5.2 触发 didSet