segue在swift中的UIAlertController之前执行

问题描述 投票:0回答:3

我刚刚编写了一个注册页面,如果用户没有在任何uitextfield中输入文本,那么它应该收到一条错误消息(UIAlert); else(如果用户在所有uitextfield中输入文本)注册页面将显示Firebase身份验证。

在我的代码中,只有在身份验证成功完成后,用户才会指向登录页面,否则它应保留在包含警报消息的注册页面中。

问题 - 我的代码能够生成警报消息,但同时即使出现错误,用户也会自动登录页面。这意味着它正在执行一个segue,它使用户登录页面,即无论警报消息如何都进行segue展开。

任何人都可以帮助我为什么会发生这种情况?

 @IBAction func registerPressed(_ sender: Any) {

    if nameText.text!.isEmpty || genderText.text!.isEmpty || countryText.text!.isEmpty || yourSchool.text!.isEmpty || yourClass.text!.isEmpty {

        print("Please fill all fields") //my code is printing this error

        //alert message popup - my code is ble to produce this alert but same it is performing segue and taking user to signin page
        //ideally, i want user to be in signup page unless all criteria meet

        let alertController = UIAlertController(title: "Error", message: "Please fill all fields", preferredStyle: .alert)
        alertController.addAction(UIAlertAction(title: "Ok", style: .default, handler: { (action:UIAlertAction) in
        print("Okay")
        }))

        let alertWindow = UIWindow(frame: UIScreen.main.bounds)
        alertWindow.rootViewController = UIViewController()
        alertWindow.windowLevel = UIWindowLevelAlert
        alertWindow.makeKeyAndVisible()
        alertWindow.rootViewController?.present(alertController, animated: true, completion: nil)


    }

    else {

        Auth.auth().createUser(withEmail: yourEmail.text!, password: yourPassword.text!) { (user, error) in

                    if error != nil {

                        ///print errror message

                        let alertController = UIAlertController(title: "Error", message: error?.localizedDescription, preferredStyle: .alert)
                        alertController.addAction(UIAlertAction(title: "Ok", style: .default, handler: { (action:UIAlertAction) in
                            print("Okay")
                        }))

                        let alertWindow = UIWindow(frame: UIScreen.main.bounds)
                        alertWindow.rootViewController = UIViewController()
                        alertWindow.windowLevel = UIWindowLevelAlert + 1;
                        alertWindow.makeKeyAndVisible()
                        alertWindow.rootViewController?.present(alertController, animated: true, completion: nil)

                    }

                    else {

                        print("You have successfully signed up")

                        self.performSegue(withIdentifier: "JoinUs2SignPage", sender: self)

                        //updating user information
                        let userID = Auth.auth().currentUser!.uid
                        let usertype: String = "Student"
                        self.ref.child("users").child(userID).setValue(["usertype": usertype ,"username": self.nameText.text!, "usergender": self.genderText.text!, "usercountry": self.countryText.text!, "userschool": self.yourSchool.text!, "userclass": self.yourClass.text!,])
                        }
            }
        }

}
ios swift uialertcontroller ibaction unwind-segue
3个回答
1
投票

从这段代码来看,它看起来并没有什么不对。但是,您应该在Auth.auth().createUser(...)运行时阻止UI。否则你有可能用正确的方法调用registerPressed,但是然后从标签中删除文本并在回调之前再次调用它。这样你就有了警报,然后调用了segue。

你也正在用你呈现警报的方式做一些非常疯狂的事情。而不是创建一个新窗口,添加一个视图控制器和所有爵士乐,只需调用self.present(alertController, animated: true)。例如。

let alertController = UIAlertController(title: "Error", message: "Please fill all fields", preferredStyle: .alert)
alertController.addAction(UIAlertAction(title: "Ok", style: .default, handler: { (action:UIAlertAction) in
    print("Okay")
}))

self.present(alertController, animated: true)

0
投票

删除segue并以编程方式推送到目标视图控制器。

    self.navigationController?.pushViewController(destinationVC, animated: true)

0
投票

我犯了一个愚蠢的错误,我直接在IBAction上创建了segue,因此每当我按下按钮时,它都会执行segue而不管UIAlerts。我的更新代码如下:

   @IBAction func registerPressed(_ sender: Any) {

    if nameText.text!.isEmpty || genderText.text!.isEmpty || countryText.text!.isEmpty || yourSchool.text!.isEmpty || yourClass.text!.isEmpty {

        //alert message popup

        let alertController = UIAlertController(title: "Error", message: "Please fill all fields", preferredStyle: .alert)
        alertController.addAction(UIAlertAction(title: "Ok", style: .default, handler: { (action:UIAlertAction) in
        print("Okay")
        }))

        self.present(alertController, animated: true, completion: nil)


    }

    else {

        Auth.auth().createUser(withEmail: yourEmail.text!, password: yourPassword.text!) { (user, error) in

                    if error != nil {

                        ///print errror message

                        let alertController = UIAlertController(title: "Error", message: error?.localizedDescription, preferredStyle: .alert)
                        alertController.addAction(UIAlertAction(title: "Ok", style: .default, handler: { (action:UIAlertAction) in
                            print("Okay")
                        }))

                        self.present(alertController, animated: true, completion: nil)

                    }

                    else {

                        let alertController = UIAlertController(title: "Congratulation", message: "You have successfully signed up", preferredStyle: .alert)
                        alertController.addAction(UIAlertAction(title: "Get Started", style: .default, handler: { (action:UIAlertAction) in

                            self.performSegue(withIdentifier: "back2SignPage", sender: self)
                        }))

                        self.present(alertController, animated: true, completion: nil)

                        //updating user information
                        let userID = Auth.auth().currentUser!.uid
                        let usertype: String = "Student"
                        self.ref.child("users").child(userID).setValue(["usertype": usertype ,"username": self.nameText.text!, "usergender": self.genderText.text!, "usercountry": self.countryText.text!, "userschool": self.yourSchool.text!, "userclass": self.yourClass.text!,])
                        }
            }
        }

}
© www.soinside.com 2019 - 2024. All rights reserved.