首页 > 解决方案 > 更改时如何将代码块与@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)
  }
}

标签: swiftswiftuicombine

解决方案


只需.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)) ?? []
    }
  }
}

推荐阅读