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)
}
}
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"))
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}))
}
}
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