Почему я не могу проверить textFields в кнопку входа в Swift - PullRequest
1 голос
/ 08 ноября 2019

Я дал делегат всем моим текстовым полям, но я не могу проверить, является ли текстовое поле пустым или нет изначально ... если я просто наведу курсор на текстовое поле, но без текста, то я могу проверить, тогда он говорит, пожалуйста, введитеPhoneNumber почему?

если я не поместил курсор в текстовое поле, то доступ напрямую переходит к другой части, даже если все текстовые поля пусты, вот мой код, пожалуйста, помогите мне в коде.

func textFieldDidBeginEditing(_ textField: UITextField) {
    textField.text = ""
}
//MARK:- ButtonActions
@IBAction func loginButton(_ sender: Any) {

     if(userIdTextFielf.text?.isEmpty)!{
        AlertFun.ShowAlert(title: "", message: "Please enter PhoneNumber", in: self)
    }
    else if(passwordTextField.text?.isEmpty)!{
        AlertFun.ShowAlert(title: "", message: "Please enter Password", in: self)
    }
    else if(passwordTextField.text?.isEmpty)! && (userIdTextFielf.text?.isEmpty)! {
        AlertFun.ShowAlert(title: "", message: "Please enter PhoneNumber & Password", in: self)
    }
    else{
        logInService()
    }
    }

Вот мой сервис входа в систему:

 //MARK:- Service part
func logInService(){

    let parameters = ["username":Int(userIdTextFielf.text ?? "") as Any,
                      "imei_number":"test2012@gmail.com",
                      "password":passwordTextField.text as Any,
                      "name":"name"]

    let url = URL(string: "https://dev.com/webservices/login")
    var req =  URLRequest(url: url!)
    req.httpMethod = "POST"
    req.addValue("application/json", forHTTPHeaderField: "Contet-Type")
    req.addValue("application/json", forHTTPHeaderField: "Accept")

    guard let httpBody = try? JSONSerialization.data(withJSONObject: parameters as Any, options: .prettyPrinted) else {return}
    req.httpBody = httpBody
    let session = URLSession.shared
    session.dataTask(with: req, completionHandler: {(data, response, error) in
        if response != nil {
            // print(response)
        }
        if let data = data {
            do{

                let json = try JSONSerialization.jsonObject(with: data, options: .mutableContainers) as! [String: Any]
                print("the json of loginnnnnn \(json)")
                var loginStatus = json["status"] as? String
                DispatchQueue.main.async {
                    if loginStatus == "Failed"
                    {
                       AlertFun.ShowAlert(title: "", message: "Invalid creadintials", in: self)
                    }
                    else{
                        self.Uid = json["id"] as? String
                        let emailL = json["user_email"] as? String
                        print("login uid \(self.Uid)")

                        KeychainWrapper.standard.set(emailL ?? "", forKey: "user_email")
                        let saveUserId: Bool = KeychainWrapper.standard.set(self.Uid!, forKey: "Uid")

                        let mainStoryBoard = UIStoryboard(name: "Main", bundle: nil)
                        let navigationController = mainStoryBoard.instantiateViewController(withIdentifier: "HomeNavigation")
                        let appDelagate = UIApplication.shared.delegate
                        appDelagate?.window??.rootViewController = navigationController
                    }
                }
            }catch{
                print("error")
            }
        }
    }).resume()
}

Если я нажимаю кнопку входа без номера телефона и пароля, он всегда говорит: Invalid creadintials

, пожалуйста, помогите мне в коде.

Ответы [ 3 ]

1 голос
/ 08 ноября 2019

Возможно, вы помещаете некоторую строку-заполнитель в свойство text текстового поля. Обычно мы бы этого не делали. Поместите строку-заполнитель в свойство placeholder текстового поля, и оно будет делать именно то, что вы хотите, а именно, отобразить текст-заполнитель, если он пуст, в противном случае показать, что ввел пользователь. И тогда вам не нужна эта textFieldDidBeginEditing реализация, и ваши простые isEmpty проверки будут работать.

Если вы хотите выполнить свой собственный процесс заполнителя вручную, используя свойство text, тогда вы должныизмените логику проверки, проверяя как isEmpty, так и то, что он не равен вашему заполнителю.

Например, вы можете использовать служебный метод, чтобы выяснить, что пользователь фактически ввел (т. е. если он равентекстовая строка по умолчанию, затем возвращает строку нулевой длины):

@IBAction func didTapLogin(_ sender: Any) {
    let userid = actualInput(for: useridTextField, defaultText: "Enter userid")
    let password = actualInput(for: passwordTextField, defaultText: "Enter password")

    switch (userid.isEmpty, password.isEmpty) {
    case (true, true):
        AlertFun.showAlert(title: "", message: "Please enter PhoneNumber & Password", in: self)

    case (true, _):
        AlertFun.showAlert(title: "", message: "Please enter PhoneNumber", in: self)

    case (_, true):
        AlertFun.showAlert(title: "", message: "Please enter Password", in: self)

    default:
        logInService()
    }
}

func actualInput(for textField: UITextField, defaultText: String) -> String {
    let text = textField.text ?? ""
    if text == defaultText {
        return ""
    } else {
        return text.trimmingCharacters(in: .whitespacesAndNewlines)
    }
}

Лично, даже если вы используете свой собственный заполнитель в трюке text, я все равно мог бы сохранить строку заполнителя вplaceholder свойство удерживать это. Я мог бы также переместить это в расширение UITextField:

extension UITextField {
    var userInput: String? { text == placeholder ? "" : text }
}

Тогда вы могли бы сделать:

class ViewController: UIViewController {

    @IBOutlet weak var imageView: UIImageView!

    @IBOutlet weak var useridTextField: UITextField!
    @IBOutlet weak var passwordTextField: UITextField!

    override func viewDidLoad() {
        super.viewDidLoad()

        useridTextField.placeholder = "Please enter userid"
        passwordTextField.placeholder = "Please enter password"

        useridTextField.text = useridTextField.placeholder
        passwordTextField.text = passwordTextField.placeholder
    }

    @IBAction func didTapLogin(_ sender: Any) {
        let userid = useridTextField.userInput ?? ""
        let password = passwordTextField.userInput ?? ""

        switch (userid.isEmpty, password.isEmpty) {
        case (true, true):
            AlertFun.showAlert(title: "", message: "Please enter PhoneNumber & Password", in: self)

        case (true, _):
            AlertFun.showAlert(title: "", message: "Please enter PhoneNumber", in: self)

        case (_, true):
            AlertFun.showAlert(title: "", message: "Please enter Password", in: self)

        default:
            logInService()
        }
    }

    func logInService() { ... }
}

extension ViewController: UITextFieldDelegate {
    func textFieldDidBeginEditing(_ textField: UITextField) {
        if textField.text == textField.placeholder {
            textField.text = ""
        }
    }

    func textFieldDidEndEditing(_ textField: UITextField, reason: UITextField.DidEndEditingReason) {
        if textField.text?.isEmpty ?? true {
            textField.text = textField.placeholder
        }
    }
}

Таким образом, вы избегаете посыпать ваш код строковыми литералами, даже еслипользователь нажимает на поле (где вы удаляете текст), теперь он может видеть строку-заполнитель, чтобы знать, что вводить и т. д.

0 голосов
/ 08 ноября 2019

Вы можете попробовать это или прежде всего решение

    if userIdTextFielf.text?.isEmptyOrWhitespace() ?? true
    {
         AlertFun.ShowAlert(title: "", message: "Please enter PhoneNumber", in: self)
        return
    }
    else if passwordTextField.text?.isEmptyOrWhitespace() ?? true
    {
         AlertFun.ShowAlert(title: "", message: "Please enter Password", in: self)
    return
    }

extension String {
func isEmptyOrWhitespace() -> Bool {
    if(self.isEmpty) {
        return true
    }
    return (self.trimmingCharacters(in: NSCharacterSet.whitespaces) == "")
}
0 голосов
/ 08 ноября 2019

используйте isEmpty вместо равенства с ""

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...