swift - 更改时如何将代码块与@State var相关联
问题描述
每当@State
变量的值myData
发生变化时,我都希望收到通知并将该数据存储在@AppStorage
变量myStoredData
中。但是,我不想在状态变量发生变化的任何地方都显式地编写这个存储代码,我想将一个代码块与它关联起来,每当状态变量发生变化并执行存储时就会得到通知。这样做的原因是,例如,我想将 state var 作为绑定传递给另一个视图,当该视图更改变量时,存储块将自动执行。我该怎么做/我可以在 SwiftUI 中做到这一点吗?
struct MyView : View {
@AppStorage("my-data") var myStoredData : Data!
@State var myData : [String] = ["hello","world"]
var body : some View {
Button(action: {
myData = ["something","else"]
myStoredData = try? JSONEncoder().encode(myData)
}) {
Text("Store data when button pressed")
}
.onAppear {
myData = (try? JSONDecoder().decode([String].self, from: myStoredData)) ?? []
}
}
}
我正在寻找这样的东西,但这不起作用:
@State var myData : [String] = ["hello","world"] {
didSet {
myStoredData = try? JSONEncoder().encode(myData)
}
}
解决方案
只需.onChange
在视图中的任何地方使用修饰符(就像您对 所做的那样.onAppear
)
struct MyView : View {
@AppStorage("my-data") var myStoredData : Data!
@State var myData : [String] = ["hello","world"]
var body : some View {
Button(action: {
myData = ["something","else"]
myStoredData = try? JSONEncoder().encode(myData)
}) {
Text("Store data when button pressed")
}
.onChange(of: myData) {
myStoredData = try? JSONEncoder().encode($0) // << here !!
}
.onAppear {
myData = (try? JSONDecoder().decode([String].self, from: myStoredData)) ?? []
}
}
}
推荐阅读
- linux - 无法在linux中连接cloudflare warp vpn
- java - 从 Spring Bean xml 到 Spring Bean Java 类
- azure-devops - Azure Pipelines:多行参数
- oauth-2.0 - 使用 getaadtoken() 生成令牌时出错
- c# - 使用派生类时,.NET 5 (Newtonsoft) 中的 Json 反序列化失败
- ios - iOS Swift 5 中的基本身份验证
- android - FAILURE:构建失败并出现异常(flutter build apk)
- c# - 从外部 IP 调用 HttpListener
- javascript - Javascript(Tampermonkey)文本荧光笔禁用按钮
- sql - 在 cte 中使用带有多个变量的交叉连接