AlertController is being popped every time in nested conditions swift ios

谁都会走 提交于 2019-12-02 07:43:40
Rahul Dasgupta

You can use this code:

@IBAction func loginAction(_ sender: Any) {

        let appDel = UIApplication.shared.delegate as! AppDelegate
        let context = appDel.persistentContainer.viewContext
        let isMatched = false
        let request = NSFetchRequest<NSFetchRequestResult>(entityName: "Users")
        request.returnsObjectsAsFaults = false

         do {

            let results = try! context.fetch(request)

            if(results.count > 0){

                for result in results as! [NSManagedObject]
                {


                    if  emailText.text == result.value(forKey: "username") as? String && passText.text == result.value(forKey: "password") as? String {
                        print(emailText.text!, passText.text!)
                        usernameGlobal = self.emailText.text!
                        let mainStoryBoard: UIStoryboard = UIStoryboard(name: "Main", bundle : nil)
                        let desController = mainStoryBoard.instantiateViewController(withIdentifier: "AddViewController") as! AddViewController
                        let newFrontViewController = UINavigationController.init(rootViewController:desController)
                        revealViewController().pushFrontViewController(newFrontViewController, animated: true)
                        isMatched = true
                        break

                    }

                }

                if !isMatched {

                      let alertController = UIAlertController(title: "Oops!", message: "Incorrect username or password", preferredStyle: .alert)
                      let defaultAction = UIAlertAction(title: "OK", style: .default, handler: nil)
                      alertController.addAction(defaultAction)

                      present(alertController, animated: true, completion: nil)
                 }

            }
        }
    }

Changes:

You add

        let isMatched = false

You add break statement in if condition. So that it breaks the loop once username and password is matched. Then after for loop check if the isMatched is false, then show the result.

if your result contains multiple different element then else block will execute multiple time. thats why alert appeared multiple time . when you found a match then you should return . if no match found then after loop alert will appear for one time .

Use this:

       @IBAction func loginAction(_ sender: Any) {

            let appDel = UIApplication.shared.delegate as! AppDelegate
            let context = appDel.persistentContainer.viewContext

            let request = NSFetchRequest<NSFetchRequestResult>(entityName: "Users")
            request.returnsObjectsAsFaults = false
            //  request.predicate = NSPredicate(format: "username = %@", "" + emailText.text!)


            do {

                let results = try! context.fetch(request)

                if(results.count > 0){

                    for result in results as! [NSManagedObject]
                    {


                        if  emailText.text == result.value(forKey: "username") as? String && passText.text == result.value(forKey: "password") as? String {
                            print(emailText.text!, passText.text!)
                            usernameGlobal = self.emailText.text!
                            let mainStoryBoard: UIStoryboard = UIStoryboard(name: "Main", bundle : nil)
                            let desController = mainStoryBoard.instantiateViewController(withIdentifier: "AddViewController") as! AddViewController
                            let newFrontViewController = UINavigationController.init(rootViewController:desController)
                            revealViewController().pushFrontViewController(newFrontViewController, animated: true)
                            return

                        }
                    }
                    let alertController = UIAlertController(title: "Oops!", message: "Incorrect username or password", preferredStyle: .alert)

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

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

                }
            }
        }
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!