AlertController выскакивает каждый раз во вложенных условиях swift ios

Я определил alertcontroller, когда имя пользователя или пароль неверны, предупреждение должно появиться, и оно работает нормально. но когда имя пользователя и пароль совпадают, несмотря на совпадение, оно появляется каждый раз при входе в систему. Я думаю, что я не определил вложенное условие правильно? помогите разобрать множественное вложенное условие.

Код для входа

import UIKit
import CoreData
import Foundation

 class ViewController: UIViewController {

var usernameGlobal : String = ""

@IBOutlet weak var emailText: UITextField!
@IBOutlet weak var passText: UITextField!

@IBOutlet weak var loginButton: UIButton!
@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)

                }

                else {

                       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)
                    }

            }

            }
        }
    }



@IBAction func signupSegue(_ sender: Any) {

    let mainStoryBoard: UIStoryboard = UIStoryboard(name: "Main", bundle : nil)
    let desController = mainStoryBoard.instantiateViewController(withIdentifier: "SignupViewController") as! SignupViewController
    let newFrontViewController = UINavigationController.init(rootViewController:desController)
    revealViewController().pushFrontViewController(newFrontViewController, animated: true)

}


override func viewDidLoad() {
    super.viewDidLoad()

    loginButton.backgroundColor = UIColor.blue

}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}


}

2 ответа

Решение

Вы можете использовать этот код:

@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)
                 }

            }
        }
    }

Изменения:

Вы добавляете

        let isMatched = false

Вы добавляете оператор break в условие if. Так что это прерывает цикл, когда имя пользователя и пароль совпадают. Затем после проверки цикла, если isMatched имеет значение false, показать результат.

Если ваш результат содержит несколько разных элементов, тогда блок else будет выполняться несколько раз. вот почему оповещение появлялось несколько раз. когда вы нашли совпадение, вы должны вернуться. если совпадение не найдено, то после цикла предупреждение появится один раз.

Использовать этот:

       @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)

                }
            }
        }
Другие вопросы по тегам