6
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

[SwiftUI]EnvironmentObjectとBinding

Posted at

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
スクリーンショット 2020-08-09 16.02.38.png スクリーンショット 2020-08-09 16.03.01.png

もう一つのViewの「増やす」を押すと親Viewの「4」のところが変わります。

参考

https://qiita.com/shiz/items/6eaf87fa79499623306a#binding
https://stackoverflow.com/questions/59259921/binding-value-from-an-observableobject

6
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?