EnvironmentObjectを使って他のViewを更新しようとしましたが中々できなく、数時間ハマってしまいました。
解決方法を見つけたので書いてみました。
どのような場合か
親View・子View・もう一つのViewの構成で、もう一つのViewから子Viewを更新したい時。
始めにやっていたこと
- 親View:EnvironmentObjectを持つ
- 子View:Stateを持つ
- もう一つのView:EnvironmentObject
- EnvironmentObjectとして
ObservableObject
を継承したクラスを使っていた
→もう一つのViewで値を変更しても、子Viewの値が更新されませんでした
解決策
- 親View:EnvironmentObjectを持つ
- 子View:Bindingを持つ
- もう一つのView:EnvironmentObject
- EnvironmentObjectとして
ObservableObject
を継承したクラス
→子ViewのStateをBinding
に変更しました
実装
親View
ContentView.swift
struct ContentView: View {
@EnvironmentObject var countSetting: CountSetting
var body: some View {
NavigationView {
List {
NavigationLink.init(destination: AnotherView()) {
ChildView(value: Binding.init(get: { self.countSetting.count }, set: { _ in }))
}
}
}
}
}
ポイントはBinding
でChildViewに値を渡しているところです。
子View
ChildView.swift
struct ChildView: View {
@Binding var value: Int
EnvironmentObjectにするクラス
CountSetting.swift
class CountSetting: ObservableObject {
@Published var count: Int = 0
}
ソース
ソースはこちら
https://gist.github.com/usk2000/95fdcd327c5fe22aa892d615721de0d9
スクショ
親View | もう一つのView |
---|---|
もう一つのViewの「増やす」を押すと親Viewの「4」のところが変わります。
参考
https://qiita.com/shiz/items/6eaf87fa79499623306a#binding
https://stackoverflow.com/questions/59259921/binding-value-from-an-observableobject