每当@State
变量myData
的值发生变化时,我希望收到通知并将该数据存储在@AppStorage
变量myStoredData
。但是,我不想在状态变量发生更改的任何地方显式编写此存储代码,我想将一个代码块与其关联,每当状态变量发生更改并执行存储时,该代码块都会收到通知。原因是,例如,我想将状态变量作为绑定(bind)传递到另一个 View ,并且当该 View 更改变量时,存储 block 将自动执行。我怎样才能做到这一点/我可以在 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)
}
}
最佳答案
只需在 View 中的任何位置使用 .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)) ?? []
}
}
}
关于swift - 当代码块发生变化时如何将其与@State var关联起来,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65082713/