Swift3 Swift 3提交表单-UITextField仅在再次聚焦字段后更改
我正在处理登录视图,并试图在验证textfield失败时更改Xcode/swift3中UITextField的边框颜色。UITextField应具有红色边框颜色Swift3 Swift 3提交表单-UITextField仅在再次聚焦字段后更改,swift3,Swift3,我正在处理登录视图,并试图在验证textfield失败时更改Xcode/swift3中UITextField的边框颜色。UITextField应具有红色边框颜色 问题是如果输入电子邮件,然后输入密码,然后按提交按钮,我必须在电子邮件文本字段出现红色边框之前再次聚焦 这是我的登录查看控制器。swift到目前为止: import Foundation import UIKit class LoginViewController : UIViewController, UITextFieldDele
问题是如果输入电子邮件,然后输入密码,然后按提交按钮,我必须在电子邮件文本字段出现红色边框之前再次聚焦 这是我的登录查看控制器。swift到目前为止:
import Foundation
import UIKit
class LoginViewController : UIViewController, UITextFieldDelegate {
@IBOutlet weak var userEmailTextField: UITextField!
@IBOutlet weak var userPasswordTextField: UITextField!
override func viewDidLoad() {
super.viewDidLoad()
}
// login button action
@IBAction func loginButtonTabbed(_ sender: Any) {
// getting values from text fields
let userEmail = userEmailTextField.text;
let userPassword = userPasswordTextField.text;
// set enpoind data
let requestURL = NSURL(string: Constants.apiUrl)
//creating a task to send the post request
var request = URLRequest(url: requestURL as! URL)
request.httpMethod = "POST"
let postString = "cmd=addUser&email="+userEmail!+"&password="+userPassword!
request.httpBody = postString.data(using: .utf8)
let task = URLSession.shared.dataTask(with: request) { data, response, error in
guard let data = data, error == nil else { // check for fundamental networking error
print("error=\(error)")
return
}
if let httpStatus = response as? HTTPURLResponse, httpStatus.statusCode != 200 { // check for http errors
print("statusCode should be 200, but is \(httpStatus.statusCode)")
print("response = \(response)")
}
do {
let json = try? JSONSerialization.jsonObject(with: data, options: [])
// store json response to dictionary
if let dictionary = json as? [String: Any] {
// check if we got validation errors
if let nestedDictionary = dictionary["validation"] as? [String: Any] {
// display validation messages on device
if let emailMsg = nestedDictionary["Email"] as? String { // change color of textfield
self.userEmailTextField.errorField()
}
}
}
} catch let error as NSError {
print(error)
}
}
//executing the task
task.resume()
}
}
和UITextField扩展名UITextField.swift:
import Foundation
import UIKit
extension UITextField {
func errorField(){
self.layer.borderColor = UIColor(red: 255/255.0, green: 59/255.0, blue: 48/255.0, alpha: 1.0).cgColor
self.layer.borderWidth = 1.0;
}
}
当你进行网络呼叫时,它总是发生在后台…所以为了进行任何类型的UI更新,你需要在主队列上。只需将
self.userEmailTextField.errorField()
放在DispatchQueue.main.async{…}
中,即可立即执行
也没有很好地测试你的代码。为什么?
即使在您当前的代码中,边框仍然会变为红色,但它会在大约6-7秒后变为红色(您可能需要更少或更多的时间)…因为它是从后台线程运行的
我不明白的是,为什么再次单击文本字段会立即显示红色边框!?我猜会发生以下情况:
从后台线程更新模型即更改文本字段颜色,该颜色将用户界面/视图排队等待更新……但由于我们在后台队列中,更新用户界面可能需要几秒钟的时间
但是你马上点击了textField并强制超快速读取textField及其所有属性,其中包括来自主线程的边框(实际用户触摸总是通过主线程处理)…尽管屏幕上还没有显示红色,但由于模型上的颜色是红色,它会从中读取并立即将颜色更改为红色 “我必须再次聚焦电子邮件文本字段,然后它才会出现红色边框。”启动模拟器时,我在电子邮件文本字段中键入电子邮件,在密码字段中键入密码,而后者处于聚焦状态,然后点击提交按钮,但什么也没有发生。在边框颜色变为红色之前,我必须再次标记电子邮件字段。如果出现验证错误,我希望在标记提交时它变为红色。您是否实现了任何textFields委托方法?如果是,那么也显示他们的代码。否则的话,这应该是有效的……不。我不知道:)我编辑了这篇文章以包含整个视图控制器。我只得到了这个,哈!刚刚解决了这个问题!当你进行网络呼叫时,它总是发生在后台…所以为了进行任何类型的UI更新,你需要在主队列上。只需将
self.userEmailTextField.errorField()
放入DispatchQueue.main.async{…}
中,即可立即执行