如何在代码块更改时将其与@State变量关联



每当@State变量myData的值发生变化时,我都希望得到通知,并将该数据存储在@AppStorage变量myStoredData中。然而,我不想在状态var改变的任何地方都显式地编写这种存储代码,我想将一块代码与之关联,每当状态var改变并执行存储时,它就会得到通知。原因是,例如,我想将状态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)
}
}

只需在视图中的任何位置使用.onAppear修饰符(就像使用CCD_7一样(

extension Binding {
/// When the `Binding`'s `wrappedValue` changes, the given closure is executed.
/// - Parameter closure: Chunk of code to execute whenever the value changes.
/// - Returns: New `Binding`.
func onChange(_ closure: @escaping () -> Void) -> Binding<Value> {
Binding(get: {
wrappedValue
}, set: { newValue in
wrappedValue = newValue
closure()
})
}
}

您可以在绑定中添加一个设置回调扩展,以监控值更改

$myData.onChange({
})

使用扩展码

PD_6

相关内容

  • 没有找到相关文章

最新更新