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
}
}
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.")
}
}
}
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)
}
}
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.
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()
}
}
}