Je suis tout à fait nouveau dans le cadre SwiftUI et je n'ai pas encore enveloppé ma tête autour de tout cela, alors soyez patient avec moi.
Existe-t-il un moyen de déclencher une "vue de superposition" de l'intérieur d'une "autre vue" lorsque sa liaison change? Voir l'illustration ci-dessous:
Je pense que cette "vue de superposition" engloberait toutes mes vues. Je ne sais pas encore comment faire cela - peut-être en utilisant ZIndex
. Je suppose également que j'aurais besoin d'une sorte de rappel lorsque la liaison change, mais je ne sais pas non plus comment le faire.
Voici ce que j'ai jusqu'à présent:
ContentView
struct ContentView : View {
@State private var liked: Bool = false
var body: some View {
VStack {
LikeButton(liked: $liked)
}
}
}
LikeButton
struct LikeButton : View {
@Binding var liked: Bool
var body: some View {
Button(action: { self.toggleLiked() }) {
Image(systemName: liked ? "heart" : "heart.fill")
}
}
private func toggleLiked() {
self.liked = !self.liked
// NEED SOME SORT OF TOAST CALLBACK HERE
}
}
Je sens que j'ai besoin d'une sorte de rappel dans mon LikeButton
, mais je ne sais pas comment tout cela fonctionne dans Swift.
Toute aide à cet égard serait appréciée. Merci d'avance!
Utilisez .presentation()
pour afficher une alerte lorsque vous appuyez sur le bouton.
Dans LikeButton
:
@Binding var liked: Bool
var body: some View {
Button(action: {self.liked = !self.liked}, label: {
Image(systemName: liked ? "heart.fill" : "heart")
}).presentation($liked) { () -> Alert in
Alert.init(title: Text("Thanks for liking!"))
}
}
Vous pouvez également utiliser .presentation()
pour présenter d'autres vues modales, comme Popover
ou ActionSheet
. Voir ici et la section "Voir aussi" de cette page dans la documentation SwiftUI d'Apple pour plus d'informations sur les différentes options de .presentation()
.
Edit : Exemple de ce que vous voulez avec une vue personnalisée en utilisant Popover
:
@State var liked = false
let popover = Popover(content: Text("Thanks for liking!").frame(width: 200, height: 100).background(Color.white), dismissHandler: {})
var body: some View {
Button(action: {self.liked = !self.liked}, label: {
Image(systemName: liked ? "heart.fill" : "heart")
}).presentation(liked ? popover : nil)
}