web-dev-qa-db-fra.com

SwiftUI @Binding Initialize

Joué avec SwiftUI et compris le concept de BindableObjects etc jusqu'à présent (au moins j'espère que je le fais).

Je suis tombé sur un problème stupide pour lequel je n'arrive pas à trouver de réponse: comment initialiser un @Binding variable?

J'ai le code suivant:

struct LoggedInView : View {

    @Binding var dismissView: Bool

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

Dans mon code de prévisualisation, je souhaite passer ce paramètre de type Binding<Bool>:

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

Comment pourrais-je aller l'initialiser? a essayé:

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

Ou même:

@Binding var dismissView: Bool = false

Mais aucune n'a fonctionné ... des idées?

21
CRE8IT

Lorsque vous utilisez votre LoggedInView dans votre application, vous devez fournir une liaison, comme un @State D'une vue précédente ou un @EnvironmentObject.

Pour le cas particulier de PreviewProvider où vous avez juste besoin d'une valeur fixe, vous pouvez utiliser .constant(false)

Par exemple.

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

L'utilisation de Binding.constant(false) est très bien mais uniquement pour les aperçus statiques. Si vous voulez réellement lancer un aperçu en direct, constant ne se comportera pas de la même manière que le cas réel car il ne sera jamais mis à jour par vos actions. Personnellement, j'utilise beaucoup Live Preview, car je peux jouer avec une vue isolée.

Voici ce que je fais pour les aperçus nécessitant 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
  • Si vous avez besoin d'une propriété simple qui appartient à une seule vue, vous devez utiliser @ State
  • Si vous avez besoin d'avoir une propriété complexe pouvant appartenir à plusieurs vues (comme 2-3 vues), vous devez utiliser @ ObjectBinding
  • Enfin, si vous avez besoin d'avoir une propriété qui doit utiliser toutes les vues alentour, vous devez utiliser @ EnvironmentObject . Source pour des informations détaillées

Pour votre cas, si vous souhaitez toujours initialiser votre variable de liaison, vous pouvez utiliser:

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