web-dev-qa-db-fra.com

SwiftUI Change View avec bouton

Je comprends qu'il y a PresentationButton et NavigationButton afin de changer les vues dans le dernier SwiftUI. Cependant, je veux faire une opération simple comme ci-dessous. Lorsque l'utilisateur clique sur le bouton Se connecter si les informations d'identification sont correctes, il les connecte mais effectue également une transition (dans ce cas, changez la vue). Cependant, je n'ai pas pu vérifier si elles sont correctes dans PresentationButton et je n'ai pas pu changer la vue dans un bouton normal. Y a-t-il une autre façon de procéder?

  @IBAction func signInClicked(_ sender: Any) {

        if emailText.text != "" && passwordText.text != "" {

            Auth.auth().signIn(withEmail: emailText.text!, password: passwordText.text!) { (userdata, error) in
                if error != nil {
                   //error
                } else {

                   performSegue(withIdentifier: "toFeedActivity", sender: nil)


                }
            }

        } else {
            //error
        }




    }
2
Atils

Voici une façon.

struct AppContentView: View {

    @State var signInSuccess = false

    var body: some View {
        return Group {
            if signInSuccess {
                AppHome()
            }
            else {
                LoginFormView(signInSuccess: $signInSuccess)
            }
        }
    }
}

struct LoginFormView : View {

    @State private var userName: String = ""
    @State private var password: String = ""

    @State private var showError = false

    @Binding var signInSuccess: Bool

    var body: some View {
        VStack {
            HStack {
                Text("User name")
                TextField($userName, placeholder: Text("type here"))
            }.padding()

            HStack {
                Text(" Password")
                TextField($password, placeholder: Text("type here"))
                    .textContentType(.password)
            }.padding()

            Button(action: {
                // Your auth logic
                if(self.userName == self.password) {
                    self.signInSuccess = true
                }
                else {
                    self.showError = true
                }

            }) {
                Text("Sign in")
            }

            if showError {
                Text("Incorrect username/password").foregroundColor(Color.red)
            }
        }
    }
}

struct AppHome: View {

    var body: some View {
        VStack {
        Text("Hello freaky world!")
        Text("You are signed in.")
        }
    }
}

10
SMP

J'ai eu le même besoin dans une de mes applis et j'ai trouvé une solution ...

Fondamentalement, vous devez insérer votre vue principale dans une NavigationView, puis ajouter un NavigationLink invisible dans votre vue, créer une variable @state qui contrôle quand vous voulez pousser la vue et changer sa valeur lors de votre rappel de connexion ...

Voilà le code:

struct ContentView: View {
    @State var showView = false
    var body: some View {
        NavigationView {
            VStack {
                Button(action: {
                    print("*** Login in progress... ***")
                    DispatchQueue.main.asyncAfter(deadline: .now() + 3) {
                        self.showView = true
                    }
                }) {
                    Text("Push me and go on")
                }

                //MARK: - NAVIGATION LINKS
                NavigationLink(destination: PushedView(), isActive: $showView) {
                    EmptyView()
                }
            }
        }
    }
}


struct PushedView: View {
    var body: some View {
        Text("This is your pushed view...")
            .font(.largeTitle)
            .fontWeight(.heavy)
    }
}
2
DungeonDev

Vous pouvez utiliser un lien de navigation avec des balises afin,

Voici le code:

tout d'abord, déclarez la balise var

@State var tag : Int? = nil

puis créez votre vue de bouton:

Button("Log In", action: {
                        Auth.auth().signIn(withEmail: self.email, password: self.password, completion: { (user, error) in
                            if error == nil {
                                self.tag = 1
                                print("success")
                            }else{
                                print(error!.localizedDescription)
                            }
                        })

Ainsi, lorsque la connexion réussira, la balise deviendra 1 et lorsque la balise deviendra 1, votre lien de navigation sera exécuté

Code du lien de navigation:

NavigationLink(destination: HomeView(), tag: 1, selection: $tag) {
                EmptyView()
                }.disabled(true)

si vous utilisez Form, utilisez .disabled car ici la vue vide sera visible sur le formulaire et vous ne voulez pas que votre utilisateur clique dessus et accède à la homeView.

0

Essayez avec state & .sheet

struct ContentView: View {
    @State var showingDetail = false

    var body: some View {
        Button(action: {
            self.showingDetail.toggle()
        }) {
            Text("Show Detail")
        }.sheet(isPresented: $showingDetail) {
            DetailView()
        }
    }
}
0
user8767767