Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/apache-flex/4.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
Swift3 Swift 3提交表单-UITextField仅在再次聚焦字段后更改_Swift3 - Fatal编程技术网

Swift3 Swift 3提交表单-UITextField仅在再次聚焦字段后更改

Swift3 Swift 3提交表单-UITextField仅在再次聚焦字段后更改,swift3,Swift3,我正在处理登录视图,并试图在验证textfield失败时更改Xcode/swift3中UITextField的边框颜色。UITextField应具有红色边框颜色 问题是如果输入电子邮件,然后输入密码,然后按提交按钮,我必须在电子邮件文本字段出现红色边框之前再次聚焦 这是我的登录查看控制器。swift到目前为止: import Foundation import UIKit class LoginViewController : UIViewController, UITextFieldDele

我正在处理登录视图,并试图在验证textfield失败时更改Xcode/swift3中UITextField的边框颜色。UITextField应具有红色边框颜色


问题是如果输入电子邮件,然后输入密码,然后按提交按钮,我必须在电子邮件文本字段出现红色边框之前再次聚焦

这是我的登录查看控制器。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{…}
中,即可立即执行