ios - 在函数运行之前阻止 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()
}
解决方案
您可以在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]
它来防止内存泄漏。
推荐阅读
- c# - C# - 对不同的数组长度使用相同的代码
- android - 如何在 Kotlin Android 中进行序列化和获取 serializeContext?
- bash - 如何通过 docker-compose 中的脚本运行 rsync 来输出进度?
- sql - 在 sql server 的 select * table 查询中显示拆分结果
- java - 如何修复“”错误“找不到符号java”?
- matlab - 从 .txt 文件导入数据
- spring - Spring Boot Rest - 如何接受多个标头
- objective-c - UITableViewCellAccessoryDisclosureIndicator 属性在 iPhone6s 上不显示,但在 XR 和模拟器上它工作正常
- css - 为 SVG 组中的每 N 行着色
- node.js - logger.debug 在使用 log4js 时不是一个函数