SwiftUI - empêcher une modal view de disparaître

Bonjour,

À 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.

Une idée ?
Merci
Nicolas

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 ?

Merci pour ton aide !

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.

Nicolas

Bonsoir,

J’essaye d’expliquer plus précisément ce que je veux faire, avec du code:

J’ai une View qui permet d’afficher une ModalView grâce à:

.sheet(isPresented: $isPresented) {
            ModalView(isPresented: self.$isPresented)
        }

Le code de la ModalView est le suivant:

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

Bonjour 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 !

Nicolas

1 J'aime

Je pense que c’est ça que tu cherches.

Par contre, comme dit sur le blog il faut passer par UIKit sinon, ce n’est pas encore possible de le faire actuellement avec SwiftUI à 100%

1 J'aime

Merci Anthony pour le lien.

Nicolas