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) */ }) } }
3 Réponses :
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
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") }) )
Ah, donc j'utilisais un Button alors que je devrais utiliser un Alert.Button. Merci!
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"))) }) } } } }