web-dev-qa-db-ja.com

SwiftUIの@Bindingについて

私はいくつかのWWDCビデオとデータバインディングに関するApple docsを見て、現在の理解によれば、プロパティデリゲートとしての@Stateはビューと注釈付きプロパティの間のバインディング接続を提供します。例えば:

@State var myText: String

var body: some View {
  VStack {
    TextField($myText, placeholder: Text("input"))
    Text(myText)
  }
}

これはmyTextを私が追加したテキストフィールドのコンテンツにバインドします(つまり、一方が変更され、もう一方が更新されます)。

ただし、$ myTextがBindingのバインディングタイプを参照していることは知っていますが、Bindingもプロパティデリゲートであることに気付き、Appleの一部のコード例に表示されていることに気付きました。これがプロパティデリゲートとして何に使用されるのか私にはわかりません。 @Stateはすでにバインディングを機能させていますが、@ Bindingには何が必要ですか? Apple docsとりあえず、これについては吸ってください。

12
Wizard

このWWDCトークによると(Swift UIを介したデータフロー):

https://developer.Apple.com/wwdc19/226

_@State_は、View内のローカル/プライベートの変更に使用する必要があります。理想的には、それらはプライベートです。

_@Binding_は、値が現在のビュードメインoutsideに存在する場合、サブビュー/再利用可能なコンポーネントで使用する必要があります。

presentation(:_) AP​​Iで確認できます。

おそらくそれらの内部にたくさんの状態があり、それらを表示する方法をSwiftUIに伝えます-しかし、表示するかどうかの決定はスーパービュー次第です。したがって、_@Binding_(isShowing)提供する必要があります。

11
Matteo Pacini

@Stateは真実のソースの概要を示すもう1つの@propertyWrapperです

"...状態を使用する場合、フレームワークは変数に永続ストレージを割り当て、依存関係として追跡します...常に初期定数値を指定する必要があります"- WWDC19セッション226 (07:41)

状態に明示的に依存する、さらに別の@propertyWrapperの@Binding。

「... Bindingプロパティラッパーを使用することで、真実のソースへの明示的な依存関係を所有せずに定義します。さらに、バインディングは状態から派生できるため、初期値を指定する必要はありません。」 - WWDC19セッション226 (13:01)

enter image description here - WWDC19セッション226

8
Cjay
  • 単一のビューに属する単純なプロパティが必要な場合は、@ Stateを使用する必要があります
  • 複数のビュー(2〜3のビューなど)に属する可能性がある複雑なプロパティが必要な場合は、@ ObjectBindingを使用します。
  • 最後に、全周ビューを使用する必要があるプロパティが必要な場合は、@ EnvironmentObject。を使用します。
3
atalayasa

Binding<T>@Bindingのプロパティデリゲートです。

$ myTextはBinding<String>を提供します。

あなたが説明したように@Stateが "バインディング作業を行う"方法は、Binding<String>のインスタンスの参照をキャプチャするゲッター/セッターで初期化されたState<T>を提供することです。

次に、TextFieldは、パスインバインディングのセッターを呼び出してmyTextの値を変更します。これにより、実際にmyTextを設定するState<T>のセッターが呼び出されます。

ご覧のとおり、バインディングには実際に格納されたプロパティが必要ではなく、ストレージを持っている他のインスタンス(この場合は@State)に委譲します。したがって、名前。

2
Jim lai

@Stateはすでにバインディング作業を行っており、@ Bindingには何が必要ですか

@Stateは自分でバインディングを作成しません。 public var binding: Binding<Value>プロパティ( docs ):

バインディングを使用して、ビューとその基礎となるモデルとの間に双方向の接続を作成します。

(あなたの場合、StringTextFieldの間)

したがって、bindingはバインド値の前後と @State 値の読み取りと変更に使用および格納する値にbindingを提供します。

2
pacification