web-dev-qa-db-fra.com

SwiftUI: superposition globale pouvant être déclenchée à partir de n'importe quelle vue

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:

enter image description here

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!

23
realph

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)
}
0
RPatel99