web-dev-qa-db-ja.com

SwiftUI @Binding Initialize

これまでにSwiftUIをいじって、BindableObjectsなどの概念を理解しました(少なくとも私はそう思います)。

@Binding変数をどのように初期化しますか?の答えを見つけることができないような愚かな問題にぶつかりました。

私は次のコードを持っています:

struct LoggedInView : View {

    @Binding var dismissView: Bool

    var body: some View {
        VStack {
            Text("Hello World")
        }
    }
}

私のプレビューコードでは、Binding<Bool>型のパラメーターを渡します。

#if DEBUG
struct LoggedInView_Previews : PreviewProvider {
    static var previews: some View {
        LoggedInView(dismissView: **Binding<Bool>**)
    }
}
#endif

どうすれば初期化できますか?試した:

Binding<Bool>.init(false)
Binding<Bool>(false)

あるいは:

@Binding var dismissView: Bool = false

しかし、どれもうまくいきませんでした...何かアイデアはありますか?

21
CRE8IT

アプリでLoggedInViewを使用する場合、前のビューの_@State_や_@EnvironmentObject_などのバインディングを提供する必要があります。

固定値が必要なPreviewProviderの特殊なケースでは、.constant(false)を使用できます

例えば。

_#if DEBUG
struct LoggedInView_Previews : PreviewProvider {
    static var previews: some View {
        LoggedInView(dismissView: .constant(false))
    }
}
#endif
_
64
Paulw11

Binding.constant(false)の使用は問題ありませんが、静的プレビューの場合のみです。実際にライブプレビューを起動する場合、constantは実際のケースと同じようには動作しません。アクションによって更新されることはありません。私は個人的にライブプレビューを頻繁に使用しています。これは、分離されたビューで遊ぶことができるためです。

これがBindingを必要とするプレビューのために私がすることです:

import SwiftUI

struct SomeView: View {
   @Binding var code: String

   var body: some View {
     // some views modifying code binding
   }
}

struct SomeView_Previews: PreviewProvider {
  static var previews: some View {
    PreviewWrapper()
  }

  struct PreviewWrapper: View {
    @State(initialValue: "") var code: String

    var body: some View {
      SomeView(code: $code)
    }
  }
}
10
NeverwinterMoon
  • 単一のビューに属する単純なプロパティが必要な場合は、@ Stateを使用する必要があります
  • 複数のビュー(2〜3ビューなど)に属する可能性のある複雑なプロパティが必要な場合は、@ ObjectBindingを使用する必要があります
  • 最後に、全周ビューを使用する必要があるプロパティが必要な場合は、@ EnvironmentObjectを使用します。ソース 詳細情報

あなたの場合、Binding変数を初期化したい場合は、以下を使用できます。

var binding: Binding = .constant(false)
6
atalayasa