@Binding
はどのようなときに使うのか
@State
で作成した変数の更新を別の画面で共有したいときに利用されるのが、SwiftUIのデータバインディング機能の一つである@Binding
です。
@State
と@Binding
は密接に関連しており、それぞれがどのように作用するのか、そしてどのように使用するのかについて見ていきましょう!
@Binding
とは
@Binding
は、他のビューで管理されている状態を参照・更新するためのプロパティラッパーです。他のビューの状態を変更する際に使用され、状態の変更が自動的に反映されます。
これらのプロパティラッパーを使うことで、SwiftUIでは簡単に状態を管理し、ビュー間でデータの受け渡しや同期が行えます。
@Binding
の使用例
// 親View (ContentView)
import SwiftUI
struct ContentView: View {
@State var isShowBView = false
var body: some View {
Button {
isShowBView = true
} label: {
Text("BViewへ遷移")
.font(.largeTitle)
}
.sheet(isPresented: $isShowBView) {
BView(isShowBView: $isShowBView)
}
}
}
@State
でisShowBViewと言うBool型(trueかfalse)を宣言します。
ContentViewが表示されたときは、isShowBViewがfalseになっているので、
.sheet(isPresented: $isShowBView)内が実行されません。
// 子View (BView)
import SwiftUI
struct BView: View {
@Binding var isShowBView: Bool
var body: some View {
ZStack {
.edgesIgnoringSafeArea(.all)
VStack {
Text("BView")
.font(.largeTitle)
Button {
isShowBView = false
} label: {
Text("閉じる")
.font(.largeTitle)
.padding()
}
}
}
}
}
子View側で@Binding
変数の準備をして、親View側から子Viewを呼び出します。
BView(isShowBView: $isShowBView)
引数の頭に$(ドルマーク)を付けることで子Viewの@Binding
のプロパティと紐付けられます。
親Viewへの紐付けが完了した@Binding
変数は、@State
変数と同じくSwiftUIの監視対象になります。
これにより、子Viewと親Viewのどちらからでもプロパティの更新が可能になり、どちらかの更新を検知するとSwiftUIが子Viewと親ViewのViewを再描画します。
動きを見てみよう
「BViewへ遷移」ボタンを押すと、isShowBViewがtrueになり、isShowBViewが再描画され、.sheet(isPresented: $isShowBView)内が実行されてBViewに画面遷移します。
「閉じる」ボタンを押すと、isShowBViewがfalseになり、isShowBViewが再描画され、.sheet(isPresented: $isShowBView)内が実行されてContentViewに画面遷移します。
@Binding
のまとめ
@State
と@Binding
でデータ共有されるView間は親子関係である必要があります。
呼び出す側のViewを「親View 」、呼び出される側のViewを「子View」と呼んでいます。
上記のコードでは、
・親View ⇨ 呼び出す側「ContentView」
・子View ⇨ 呼び出される側「BView」
となります。
@Binding
というのは、View間でのデータの共有ができる修飾子です。
画面Aと画面Bがあるとすると、画面Bで画面Aの@State
を変更したいときに@Binding
を使います。
@State
については下記の記事で解説しています