2017-12-19 4 views
0

Ich habe einen Alarmcontroller definiert, wenn der Benutzername oder das Passwort nicht korrekt ist, sollte der Alarm aufgehen, und es funktioniert einwandfrei. aber wenn der Benutzername & Passwort trotz der Übereinstimmung übereinstimmt, taucht es jedes Mal auf, wenn Sie sich einloggen. Ich glaube, ich habe die verschachtelte Bedingung nicht richtig definiert? hilf mir, den verschachtelten Zustand zu sortieren.AlertController wird jedes Mal in verschachtelten Bedingungen aufgerufen. Swift ios

-Code für Anmeldung

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


} 
+0

ist Ihre results.count == 1? – koropok

+0

if (results.count> 0) { –

+0

Es besteht die Möglichkeit, dass Ihr Ergebnisarray ein Objekt enthält, das nicht "Benutzername" und "Kennwort" enthält. also wird dein anderer Zustand immer passieren. – koropok

Antwort

0

Sie diesen Code verwenden können:

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

      } 
     } 
    } 

Änderungen:

Sie fügen

 let isMatched = false 

Sie fügen Pause Erklärung in if-Bedingung. Damit bricht es die Schleife, sobald Benutzername und Passwort übereinstimmen. Überprüfen Sie dann nach einer for-Schleife, ob isMatched false ist, und zeigen Sie das Ergebnis an.

+0

Sorry, du bist falsch geschrieben. –

0

wenn Ihr Ergebnis mehr verschiedenen Elemente enthält dann auch Block mehrere Zeit ausgeführt wird. Deshalb erschien die Warnung mehrmals. Wenn Sie eine Übereinstimmung gefunden haben, sollten Sie zurückkehren. Wenn keine Übereinstimmung gefunden wird, wird die Nachalarmmeldung einmal angezeigt. diese

Verwendung:

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

       } 
      } 
     } 
+0

Erklären Sie, was Sie geändert haben, damit OP verstehen kann, was mit seinem Code nicht stimmt. –

+0

@DharmeshKheni ok –

Verwandte Themen