À 15:15 dans la vidéo [https://developer.apple.com/videos/play/wwdc2019/224], il est expliqué comment empêcher qu’une vue modale disparaisse par mégarde, si l’utilisateur a commencé à saisir des informations non encore sauvegardées. C’est pour UIKit.
Je ne trouve pas comment faire avec SwiftUI.
Il s’agit d’une « sheet ».
Je peux mettre un « print('toto ») dans un .onDisappear
.onDisappear() {
print("onDisappear")
}
Mais pas déclencher une alerte ou n’importe quelle action.
Salut, je n’ai pas fait de SwiftUI depuis l’été dernier mais je me souviens que les vues modales s’affichent via un booléen que tu passes à true pour l’afficher.
As-tu essayé de le passer à false dans ton onDisappear si tu veux empêcher le modal de disparaître ?
Il y a bien un boolean qui permet de gérer ça.
Si je le mets à true dans le onDisappear, la vue modale disparait et une nouvelle vue modale apparait juste après (c’est ce qu’il me semble, puisque les informations saisies dans les champs de la vue sont remises à zéro).
Ce qui ne répond donc pas à mon objectif d’avoir le temps de prévenir l’utilisateur qu’il y a des données non enregistrées.
struct ModalView: View {
@Binding var isPresented: Bool
@State var alertIsPresented = false
@State var texteSaisi = ""
var body: some View {
VStack {
TextField("Saisissez votre texte", text: $texteSaisi)
}
.font(.largeTitle)
.alert(isPresented: $alertIsPresented) {
Alert(title: Text("Alerte - du texte a été saisi"))
}
.onDisappear {
print("pouf")
if self.texteSaisi != "" {
print("je veux pouvoir afficher une alerte et empêcher la fermeture")
// La commande ci-dessous ne permet pas d'afficher l'alerte
self.alertIsPresented = true
}
}
}
}
Lorsque l’utilisateur a saisi du texte dans le TextField puis qu’il fait balayer la ModalView vers le bas, je voudrais pouvoir empêcher cette ModalView de disparaître pour avoir le temps de demander à l’utilisateur s’il veut sauvegarder ce qu’il vient de saisir.
J’espère que c’est plus clair.
Cordialement,
Nicolas
comme discuté lors de la séance de coaching de jeudi dernier, je ne pense pas que ce soit possible à l’heure actuelle avec SwiftUI. Nous avions peut être trouvé des pistes de contournement que tu devais explorer. J’espère que ça a marché
Merci Maxime pour ton aide, que ce soit lors du coaching ou des interventions sur le forum !
Je me doutais un peu de la réponse, mais ça a eu au moins le mérite de bien reformuler la question !
Pour le contournement, je suis passé à une vue « normale », pour laquelle je maîtrise les conditions de sortie, via des boutons.
J’imagine que j’aurais pu encapsuler une vue modale UIKit dans SwiftUI; pas eu envie de me lancer là-dedans !