web-dev-qa-db-fra.com

La mise à jour SwiftUI @Binding ne rafraîchit pas la vue

Je sens que je manque quelque chose de très basique, mais cet exemple de code SwiftUI ne modifiera pas la vue (malgré la mise à jour de la liaison) lorsque le bouton est cliqué

Tutoriels J'ai lu suggérer que c'est la bonne façon d'utiliser une liaison et la vue devrait se rafraîchir automatiquement

import SwiftUI

struct ContentView: View {
    @Binding var isSelected: Bool

    var body: some View {
        Button(action: {
            self.isSelected.toggle()
        }) {
            Text(isSelected ? "Selected" : "Not Selected")
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    @State static var selected: Bool = false

    static var previews: some View {
        ContentView(isSelected: $selected)
    }
}
3
simeon

La vue SwiftUI affecte @Binding. @State affecte la vue SwiftUI. @State var affecte la vue, mais pour affecter un autre @State il doit être utilisé comme reliure en ajoutant un _ $ pour donner un nom au nom et cela ne fonctionne que dans SwiftUI.

Pour déclencher un changement SwiftUI de l'extérieur, c'est-à-dire pour fournir/mettre à jour l'image, utilisez Publisher qui ressemble à ceci:

// Declare publisher in Swift (outside SwiftUI)    
public let imagePublisher = PassthroughSubject<Image, Never>()

// And within SwiftUI it must be handled:
struct ContentView: View {
// declare @State that updates View:
    @State var image: Image = Image(systemName: "photo")
    var body: some View {
// Use @State image declaration
                image
// Subscribe this value to publisher "imagePublisher"
                    .onReceive(imagePublisher, perform: { (output: Image) in
// Whenever publisher sends new value, old one to be replaced
                        self.image = output
                    })
    }
}

// And this is how to send value to update SwiftUI from Swift:
imagePublisher.send(Image(systemName: "photo"))
4
Niko

Dans le niveau supérieur de SwiftUI, @Binding ne peut pas actualiser la hiérarchie de View à moins d'ajouter manuellement un @state ou d'autres déclencheurs d'actualisation.

          struct ContentView: View {
        @Binding var isSelected : Bool
        @State var hiddenTrigger = false

        var body: some View {
            VStack{
            Text("\(hiddenTrigger ? "" : "")")
            Button(action: {
                self.isSelected.toggle()
                self.hiddenTrigger = self.isSelected
            }) {
                Text(self.isSelected? "Selected" : "not Selected")
            }
            }
        }
    }

    struct ContentView_Previews: PreviewProvider {

        static var selected: Bool = false

        static var previews: some View {
            ContentView(isSelected: Binding<Bool>(get: {selected}, set: { newValue in
                selected = newValue}))
        }
    }
2
E.Coms

Vous devez utiliser @State au lieu de @Binding.

  • Si l'interface utilisateur doit être mise à jour lorsque sa valeur change, vous désignez une variable en tant que variable @State. C'est la source de la vérité.

  • Vous utilisez @Binding au lieu de @State, lorsque la vue ne possède pas ces données et n'est pas la source de la vérité.

Voici votre variable:

@State var isSelected: Bool
0
Roland Lariotte