Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Json I';我的登录验证有问题_Json_Swift_Alert - Fatal编程技术网

Json I';我的登录验证有问题

Json I';我的登录验证有问题,json,swift,alert,Json,Swift,Alert,我有一个JSON Post身份验证来发出登录请求,当然我需要发送user&password参数来接收填充我的HomeViewController的响应,所以我需要首先验证这两个参数,如果用户不存在,当然我会发送警报并禁止访问家庭。问题是,我不知道该用哪种方法进行验证,因为我这样做的方式会在验证之前给我一个警告。这是我的代码: class LoginViewController: UIViewController, LoginProtocol { @IBOutlet weak var u

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

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,但问题是,当我单击“Ingrear”(登录)按钮时,它会首先显示一个空白警报,只有在我第二次单击按钮时,它才让我立即通过。如果我以前没有调用,我不知道为什么要发送我在“func验证”中声明的警报。我将附上一张图片,向您显示出现的警报:


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

如果self.idResponse!=“0”

纠正此if条件以检查其是否为空,然后不要调用验证消息


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

首先按如下方式更新代码和用户

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

如果要在imageview中添加警报,请使用以下代码

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

alert.view.addSubview(imageView)

您是否知道
dataTask(with
异步工作?当您想要验证时?验证后您想要调用login?与您想要知道的内容无关,仅供参考:此行
DoLogin(self.username.text!,self.password.text!)
如果用户未输入密码或用户名,则会崩溃。因此,最好安全地打开包装。请参阅,您必须实现完成处理程序才能获得通知。这里有数百个相关问题。简短示例:抱歉,但这不起作用,因为要在包装上写入用户和密码,首先需要进行验证TextView,所以我不能将条件放在JSON序列化中。你能帮我展示一下if条件必须是什么吗?因为我这样写,什么都没有发生:if self.idResponse.isEmpty==true{}else if self.idResponse!=“0”{验证(消息:self.message)}else{let vc=self.storyboard!。实例化eviewcontroller(标识符为:“home”)为!HomeViewController self.present(vc,动画:false,完成:nil)vc.getUser=self.username.text!vc.getPassword=self.password.text!}根据Vadian的回答,一旦在完成处理程序中添加此警报代码显示,您将不会面临响应为空的问题,因此您将不会看到空警报。在完成处理程序中,您可以拥有有效的响应条件和无效的响应条件,并相应地执行操作。成功和错误情况将取决于验证服务将返回的响应。