首页 > 解决方案 > 在函数运行之前阻止 segue 执行

问题描述

我有一个多步骤用户注册表单,在第一页上,我正在根据数据库检查文本字段中的电子邮件地址,看看它是否存在。我有一个函数可以检查数据库并返回一个正在工作但在 segue 之后运行的布尔值。我想确保在执行 segue 之前检查此值。

这是执行验证然后进入下一个屏幕的代码:

@IBAction func nextButtonClicked(_ sender: Any) {

    // Validation
    if (txtUsername.text!.isEmpty) {
        helper.displayMessage(vc: self, userMessage: "You must enter a username.", dismiss: false)
        return
    }
    if (txtEmail.text!.isEmpty) {
        helper.displayMessage(vc: self, userMessage: "You must enter a valid email address.", dismiss: false)
        return
    }

    // This is the function that is running post-segue
    doesEmailExist(email: txtEmail.text!, userCompletionHandler: { doesExist, error in
        if let doesExist = doesExist {
            if (doesExist == true) {
                self.helper.displayMessage(vc: self, userMessage: "This email is already registered.", dismiss: false)
                return
            }
        }
    })

    if (txtPassword.text!.count < 6) {
        helper.displayMessage(vc: self, userMessage: "Password must be at least 6 characters.", dismiss: false)
        return
    }
    if (txtPassword.text! != txtConfirmPassword.text!) {
        helper.displayMessage(vc: self, userMessage: "Passwords must match.", dismiss: false)
        return
    }

    // Set global vars
    users.username = txtUsername.text
    users.email = txtEmail.text
    users.password = txtPassword.text

    DispatchQueue.main.async {
        self.performSegue(withIdentifier: "goToPage2", sender: nil)
    }

}

这是检查电子邮件是否存在的函数:

func doesEmailExist(email: String, userCompletionHandler: @escaping (Bool?, Error?) -> Void) {

    print(email)
    let myURL = URL(string: "https://www.mysite1.org/checkIfEmailExists.php")

    var request = URLRequest(url:myURL!)
    request.httpMethod = "POST"

    let postString = email

    print(postString)

    request.httpBody = postString.data(using: String.Encoding.utf8)

    let task = URLSession.shared.dataTask(with: request, completionHandler: { (data: Data?, response: URLResponse?, error: Error?) in

        if error != nil {
            self.helper.displayMessage(vc: self, userMessage: "Could not perform this request, try later")
            print("error=\(String(describing: error))")
            return
        }
        // convert server side response to NSDictionary object
        do {
            let json = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as? NSDictionary

            if let parseJSON = json {

                let msg = parseJSON["status"] as? String

                if (msg == "error") {
                    self.doesEmailExist = true
                    userCompletionHandler(true, nil)
                    print("MSG=error \(self.doesEmailExist)")
                } else {
                    self.doesEmailExist = false
                    userCompletionHandler(false, nil)
                    print("MSG != error \(self.doesEmailExist)")
                }


            } else {
                userCompletionHandler(nil, error)
                self.helper.displayMessage(vc: self, userMessage: "Couldn't do it, parseJSON = json", dismiss: true)
            }
        } catch {
            self.helper.displayMessage(vc: self, userMessage: "Couldn't do it, do stmt", dismiss: true)
            print(error)
        }
    })
    task.resume()

}

标签: iosswiftxcode

解决方案


您可以在doesEmailExist方法的回调中执行此操作,如果电子邮件不存在并且回调返回 false(意味着用户不存在),则检查其他步骤,然后如果其他步骤也有效,则执行 segue:

doesEmailExist(email: txtEmail.text!, userCompletionHandler: { doesExist, error in
    if let doesExist = doesExist {
        if (doesExist == true) {
            self.helper.displayMessage(vc: self, userMessage: "This email is already registered.", dismiss: false)
            return
        } else {
            if (txtPassword.text!.count < 6) {
                self.helper.displayMessage(vc: self, userMessage: "Password must be at least 6 characters.", dismiss: false)
                return
            }
            if (txtPassword.text! != txtConfirmPassword.text!) {
                self.helper.displayMessage(vc: self, userMessage: "Passwords must match.", dismiss: false)
                return
            }

            // Set global vars
            self.users.username = txtUsername.text
            self.users.email = txtEmail.text
            self.users.password = txtPassword.text

            DispatchQueue.main.async {
                self.performSegue(withIdentifier: "goToPage2", sender: nil)
            }
        }
    }
})

编译器会警告你使用self变量,用 self 编辑代码,然后它应该编译并工作。您可能还想使用[weak self]它来防止内存泄漏。


推荐阅读