我的登录身份验证遇到了麻烦

时间:2017-07-13 15:08:47

标签: json swift alert

我有一个JSON Post身份验证来发出登录请求,当然我需要发送用户&用于接收填充我的HomeViewController的响应的密码参数,所以我首先需要验证这两个参数,如果用户当然不存在,我将发送一个Alert并禁止访问Home。问题是我不知道在哪种方法中进行此验证,因为我这样做的方式会在验证之前向我发出警报。这是我的代码:

class LoginViewController: UIViewController, LoginProtocol {

    @IBOutlet weak var username: UITextField!
    @IBOutlet weak var password: UITextField!
    @IBOutlet weak var activityIndicator: UIActivityIndicatorView!

    var user : String = ""
    var psw : String = ""
    var idResponse : String = ""
    var message : String = ""
    override func viewDidLoad() {
        super.viewDidLoad()
    }

    @IBAction func validateLogin(_ sender: Any) {
        DoLogin(self.username.text!, self.password.text!)
    }

    @IBAction func login(_ sender: Any) {

        if self.idResponse != "0" {
            validation(message: self.message)
        } else {
            let vc = self.storyboard!.instantiateViewController(withIdentifier: "home") as! HomeViewController
            self.present(vc, animated: false, completion: nil)
            vc.getUser = self.username.text!
            vc.getPassword = self.password.text!
        }
    }

    func validation(message: String) {
        let myAlert = UIAlertController(title: "Alert", message: message, preferredStyle: UIAlertControllerStyle.alert)
        let okAction = UIAlertAction (title: "Ok", style: UIAlertActionStyle.default, handler: nil)
        myAlert.addAction(okAction)
        self.present(myAlert, animated: true, completion: nil)
        return
    }

func DoLogin(_ user:String, _ psw:String)
    {
        let url = URL(string: "http://162.209.99.39:8080/MiClaroBackend/auth")
        let session = URLSession.shared

        let request = NSMutableURLRequest(url: url!)
        request.httpMethod = "POST"

        self.username.text = user
        self.password.text = psw

        let paramToSend = ["username":user,"password":psw]
        request.setValue("application/json", forHTTPHeaderField: "Content-Type")
        request.httpBody = try! JSONSerialization.data(withJSONObject: paramToSend)

        let task = session.dataTask(with: request as URLRequest, completionHandler: {
            (data, response, error) in

            guard let _:Data = data else
            {
                return
            }

            let json:AnyObject?

            do {
                json = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as? NSDictionary
                if let parseJSON = json{
                    let loginModel = LoginModel()

                    let defaultServiceResponse = parseJSON["defaultServiceResponse"] as! NSDictionary
                    loginModel.message = defaultServiceResponse["message"] as! String
                    loginModel.idResponse = defaultServiceResponse["idResponse"] as! Int

                    self.idResponse = String(loginModel.idResponse)
                    self.message = loginModel.message

                    print(json!)

                }
            } catch {
                let error = ErrorModel()
                error.phrase = "PARSER_ERROR"
                error.code = -1
                error.desc = "Parser error in login action"
            }
        })

        task.resume()
    }

validateLogin方法附加到TextView,其操作为:“EditingDidEnd”。所以我需要的是,当我写完密码后,DoLogin函数验证了存在并让我继续使用HomeViewController,但问题是当我点击按钮'Ingresar'(登录)时,它首先显示一个空白的警报并且只有我第二次点击按钮才能立即通过。我不知道为什么发送我在“func验证”中声明的警报,如果我之前没有调用它。我将附上一张图片,向您展示正在出现的警报:

The Alert

3 个答案:

答案 0 :(得分:1)

当您按下“登录”按钮时,您的EditingDidEnd方法可能会调用在后台处理的DoLogin。因此,当你的idResponse被初始化为“”空字符串时,你的if条件变为真。

如果self.idResponse!=“0”

如果条件检查是否为空则不要调用验证消息。

执行此操作的最佳方法是仅在单击“登录”按钮后调用DoLogin,如果成功重定向到主页。否则显示警报。请注意在主线程上执行UI操作。

答案 1 :(得分:1)

首先像这样更新代码和用户

func DoLogin(_ user:String, _ psw:String)
    {
        let url = URL(string: "http://162.209.99.39:8080/MiClaroBackend/auth")
        let session = URLSession.shared

        let request = NSMutableURLRequest(url: url!)
        request.httpMethod = "POST"


        let paramToSend = ["username":user,"password":psw]
        request.setValue("application/json", forHTTPHeaderField: "Content-Type")
        request.httpBody = try! JSONSerialization.data(withJSONObject: paramToSend)

        let task = session.dataTask(with: request as URLRequest, completionHandler: {
            (data, response, error) in

            guard let _:Data = data else
            {
                return
            }

            let json:AnyObject?

            do {
                json = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as? NSDictionary
                if let parseJSON = json{
                    let loginModel = LoginModel()

                    let defaultServiceResponse = parseJSON["defaultServiceResponse"] as! NSDictionary
                    loginModel.message = defaultServiceResponse["message"] as! String
                    loginModel.idResponse = defaultServiceResponse["idResponse"] as! Int

                    self.idResponse = String(loginModel.idResponse)
                    self.message = loginModel.message
 if self.idResponse != "0" {
            validation(message: self.message)
        } else {
  let vc = self.storyboard!.instantiateViewController(withIdentifier: "home") as! HomeViewController
            self.present(vc, animated: false, completion: nil)
            vc.getUser = user!
            vc.getPassword = psw!
        }

                }
            } catch {
                let error = ErrorModel()
                error.phrase = "PARSER_ERROR"
                error.code = -1
                error.desc = "Parser error in login action"
            }
        })

        task.resume()
    }

答案 2 :(得分:0)

如果您想在imageview中添加提醒,请使用此代码

var imageView = UIImageView(frame: CGRectMake(220, 10, 40, 40))
imageView.image = yourImage

alert.view.addSubview(imageView)