Попытайтесь представить UIAlertController, вид которого не находится в иерархии окон

Более конкретно, я получаю предупреждение об ошибке:

Attempt to present UIAlertController whose view is not in the window hierarchy!

В настоящее время я создаю страницу регистрации, в которой пользователю предлагается заполнить несколько конкретных данных, таких как имя, страна, адрес электронной почты, пароль и т. Д. Чтобы убедиться, что пользователь предоставляет всю необходимую информацию, я пытаюсь написать код для отправки оповещения, если пользователь делает это. не предоставлять всю информацию. Я написал код с помощью помощи от betoverflow.

Проблема: всякий раз, когда пользователь оставлял какое-либо поле пустым, он не отображает предупреждение и по умолчанию выполняет переход, который переводит пользователя на страницу входа. Это первый раз, когда я создаю предупреждение и, следовательно, не понимаю, что происходит (я считаю, что 95% моего кода на месте)

кто-нибудь может помочь?

     @IBAction func signUpPressed(_ 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 above error in the Xcode console but the below code is not working 

        //setting error message if not all fiels filled
        let alertController = UIAlertController(title: "Error", message: "Please fill all fields", preferredStyle: .alert)

        let defaultAction = UIAlertAction(title: "OK", style: .cancel, handler: nil)
        alertController.addAction(defaultAction)

        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)

                let defaultAction = UIAlertAction(title: "OK", style: .cancel, handler: nil)
                alertController.addAction(defaultAction)

                self.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!,])
            }
        }
    }

2 ответа

@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

        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!,])
                        }
            }
        }

}

Действие может быть вне основного потока

  DispatchQueue.main.async {

  ///print errror message
   let alertController = UIAlertController(title: "Error",    message: error?.localizedDescription, preferredStyle: .alert)

   let defaultAction = UIAlertAction(title: "OK", style: .cancel, handler: nil)
   alertController.addAction(defaultAction)

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


}

Попробуйте этот подход

проверить пустое пространство, как это

 let nameTrimmed = self.nameText.text?.trimmingCharacters(in: .whitespacesAndNewlines)

 let genderTrimmed = self.genderText.text?.trimmingCharacters(in: .whitespacesAndNewlines)

 let countryTrimmed = self.countryText.text?.trimmingCharacters(in: .whitespacesAndNewlines)

 let schoolTrimmed = self.schoolText.text?.trimmingCharacters(in: .whitespacesAndNewlines)



 if  nameTrimmed.text == "" ||  genderTrimmed.text == "" ||   countryTrimmed.text == "" ||  schoolTrimmed.text == "" 
Другие вопросы по тегам