7
votes

SwiftUI: Comment exécuter la fermeture lorsque l'alerte est rejetée?

J'ai essayé swiftUI et j'ai regardé ce tutoriel de Ray Wenderlich ... J'ai remarqué qu'ils n'avaient pas réimplémenté la fonctionnalité "nextRound" ... alors j'ai essayé de le faire moi-même. Ran dans un problème (ce qu'ils ont peut-être aussi fait):

La question de base est plus générale:

En utilisant swiftUI, comment déclencher une fonction lorsqu'une alerte est rejetée - lorsque l'utilisateur clique sur "OK". ?

J'ai essayé d'utiliser l'argument licenciementButton du constructeur Alert ...

(et aussi la méthode .onDisappear de View, mais je ne peux pas comprendre comment l'appliquer à la vue Alert.)

Code:

import SwiftUI

struct ContentView: View {

    @State var shouldShowAlert: Bool = false

    // this never gets called
    func onAlertDismissed() {
        print("you will not see this in the console")
    }

    // this doesn't seem to work
    var dismissButton: some View {

        Button(action: {
            self.onAlertDismissed()
        }) {
            // Bilbo Baggins does not appear -- "OK" still shows
            Text("BILBO BAGGINS")
        }
    }

    var body: some View {

        VStack {
            Spacer()

            Button(action: {
                self.shouldShowAlert = true
            }) {
                Text("show the alert!")
            }
            Spacer()
        }.alert(isPresented: $shouldShowAlert, content: {

            // what to add here?
            Alert(title: Text("Alert:"), message: Text("press OK to execute onAlertDismissed()..."))

            // what I have tried and doesn't work:
            /*
             Alert(title: Text("Alert:"), message: Text("press OK to execute onAlertDismissed()..."), dismissButton: self.dismissButton as? Alert.Button)
             */


        })

    }
}


0 commentaires

3 Réponses :


1
votes

En regardant votre code, il semble que vous n'incluez pas de bouton dans la propriété d'alerte, donc votre alerte n'exécute aucune action, en swiftui la signature d'alerte est

init(title: Text, message: Text? = nil, primaryButton: Alert.Button, secondaryButton: Alert.Button)

Implémenter correctement la signature est la première étape


0 commentaires

14
votes

Le bouton est construit un peu différemment. Vous devez essentiellement utiliser une méthode de fabrique statique d' Alert.Button pour les construire et les transmettre.

Alert(title: Text("Alert:"),
    message: Text("press OK to execute default action..."),
    dismissButton: Alert.Button.default(
        Text("Press ok here"), action: { print("Hello world!") }
    )
)

Alert(title: Text("Alert!"), message: Text("Message"),
    primaryButton: Alert.Button.default(Text("Yes"), action: {
        print("Yes")
    }),
    secondaryButton: Alert.Button.cancel(Text("No"), action: {
        print("No")
    })
)


1 commentaires

Ah, donc j'utilisais un Button alors que je devrais utiliser un Alert.Button. Merci!



1
votes

Il est possible de créer des alertes comme celle-ci:

import SwiftUI

struct ContentView: View {

@State var showingAlert = false

var body: some View {
    VStack {
        HStack { 
                Button(action: {
                    self.showingAlert = true
            })
            {
                Text("Save")
                    .font(.headline)
            }
            .alert(isPresented: $showingAlert, content: { 
                return Alert(title: Text("Save Product"), message: Text("Are you sure you want to save the changes made?"), primaryButton: .default(Text("Yes"), action: {
                    //insert an action here
                }), secondaryButton: .destructive(Text("No")))
                })
            }
        }
    }
}


0 commentaires