swift - 当代码块发生变化时如何将其与@State var关联起来

标签 swift swiftui combine

每当@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/

相关文章:

ios - 如何使用 Swift 在 segue 中获取数据

ios - 重新加载单元格后向上滚动时具有动态单元格高度的 UITableView 跳跃

core-data - SwiftUI 核心数据错误 - "Cannot convert value of type ' FetchedResults<GCItem >' to expected argument type ' Range<Int >'"

ios - 在 UIViewControllerRepresentable 中,如何将 ObservedObject 的值传递给 View Controller 并在每次值更改时更新它?

快速组合接收器接收值内存泄漏

ios - 如何使用@IBDesignable 属性为 UILabel 设置填充?

ios - 初始化需要 "self"作为参数的 Swift 属性

swift - 基于 ViewModel 状态更新 SwiftUI View ?

swiftui - 如何隐藏 SwiftUI 列表分隔符

swiftui - 有没有办法在 SwiftUI 中删除列表中的一行?