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?
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
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)
}
}
}
Pour votre cas, si vous souhaitez toujours initialiser votre variable de liaison, vous pouvez utiliser:
var binding: Binding = .constant(false)