簡體   English   中英

迅速在UIAlertController之前執行segue

[英]segue performed before the UIAlertController in swift

我剛剛編寫了一個注冊頁面,其中如果用戶未在任何uitextfield中輸入文本,則它應該收到一條錯誤消息(UIAlert); 否則(如果用戶在所有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!,])
                        }
            }
        }

}

從這段代碼來看,似乎沒有什么錯。 但是,您應該在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)

刪除序列並以編程方式推送到目標視圖控制器。

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

我犯了一個愚蠢的錯誤,我直接在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!,])
                        }
            }
        }

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM