Présente une vue sans passer par un bouton ou un lien en swiftUI

Je cherche à présenter une vue en fullScreencover autrement qu’avec un bouton, j ai le même problème avec les vues alertes.

Car dans mon exemple après une authentification biométrique réussie je souhaite présenter une autre vue, et donc pas besoin de bouton. Même chose pour une alerte en cas d’échec …

swift UIKIT je te regrette déjà lol, mais non

Salut Philippe,

Tout d’abord, il serait mieux que tu copie/colle ton code plutôt que de faire une capture d’écran. Ca évite de tout retaper et aussi de recevoir plus de réponses… :wink:

POUR INFO
Pour mettre au format « code » comme j’ai fait juste en dessous, il suffit de mettre 3 apostrophes inversés ``` (la touche à gauche de la lettre Z sur les claviers Apple) à la ligne précédente et la ligne suivante du code à citer).

C’est un très bon début !
Avec SwiftUI, tu dois simplement utiliser le .fullScreenCover() sur le VStack() de la vue principale :

import SwiftUI
import LocalAuthentication

struct ContentView: View {
    @State var isPresented: Bool = false
    
    var body: some View {
        VStack {
            Image(systemName: "faceid")
                .resizable()
                .aspectRatio(contentMode: .fill)
                .frame(width: 150, height: 150, alignment: .center)
                .foregroundColor(.red)
        }.onAppear() {
            authentificationBiometrique()
        }.onTapGesture(count: 1, perform: {
            authentificationBiometrique()
        })
        .fullScreenCover(isPresented: $isPresented, content: VuePhoto.init)
    }
    
    func authentificationBiometrique() {
        let context = LAContext()
        let policy: LAPolicy = .deviceOwnerAuthenticationWithBiometrics
        let reason: String = "Pour acceder à votre photos"
        var error: NSError?
        
        if context.canEvaluatePolicy(policy, error: &error) {
            context.evaluatePolicy(policy, localizedReason: reason) { (success, error) in
                if let error = error {
                    print(error.localizedDescription)
                }
                if success {
                    print("Super")
                    self.isPresented.toggle()
                }
            }
        }
    }
}
struct VuePhoto: View {
    var body: some View {
        VStack {
            Image(systemName: "checkmark.circle.fill")
                .resizable()
                .aspectRatio(contentMode: .fill)
                .frame(width: 150, height: 150, alignment: .center)
                .foregroundColor(.green)
        }
    }
}
struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        Group {
            ContentView()
                .previewLayout(.sizeThatFits)
            VuePhoto()
                .previewLayout(.sizeThatFits)
        }
    }
}

Quelques points à noter :

  • DispatchQueue.main.async ne sert à rien
  • ‹ error › sera appelé si FaceID a raté 3 fois ou si l’utilisateur a lui même annulé (donc il vaut mieux utiliser error.localizedDescription)
  • ‹ print(« raté ») › ne sers donc pas à grand chose
  • Comme l’image « faceid » ne peut pas être cliquée, l’application doit être redémarrée pour pouvoir retenter l’authentification. Je me suis donc permis de rajouter .onTapGesture(count: 1, perform: { authentificationBiometrique() })

J’espère que ca te débloquera pour la suite…

Bien Cordialement,
Cedric

1 J'aime

@cedric06nice Bonjour tout d’abord merci, pour tes conseils tu sembles avoir une grande expérience de Swift UI. contrairement à moi qui suit encore dans l’apprentissage.

j’essai simplement de transposer mes connaissances de Swift UIKit ce qui est plutôt compliqué, car c’est une autre façon de penser le code je trouve.

Je vais regarder ton code avec attention merci encore.

1 J'aime

Pas du tout une « grande experience » !
Je me suis juste concentré sur le sujet pendant mes 5 mois de confinements… :laughing:

C’est totalement différent de UIKit en effet. Très déroutant au départ mais une fois que tu as « capté le truc », ca deviens plus facile.

Si tu suis bien les cours de @mbritto et applique la separation de l’affichage et du code comme il explique si bien (pour ne pas dire « comme il rabâche dans tous ses cours » ! :joy:), tu réaliseras qu’en fait il suffit de créer toutes tes vues dès le départ et les « cacher », avant de les afficher avec du code (ta variable isPresented dans ce cas là…).

Cedric

2 J'aimes

C’est pour être sûr que ça finisse par renter :grin:

3 J'aimes