简体   繁体   English

如何使用SkyFloatingLabelTextField快速验证textField

[英]How to validate textField in swift using SkyFloatingLabelTextField

I am using SkyFloatingLabeltextField for textfield. 我将SkyFloatingLabeltextField用于文本字段。 I want to check all the textfields are valid then I want to call next viewController.So please tell me how to check func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {} 我想检查所有文本字段是否有效,然后再调用下一个viewController。因此,请告诉我如何检查func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {}

is true or not??? 是真的吗??? Below is my code 下面是我的代码

 func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {


    if let text = username.text {

        let message = Comman.matches(for: "[a-zA-Z]+[0-9a-zA-Z._%+-]+[a-zA-Z0-9]+@[a-zA-Z0-9-]+\\.[a-zA-Z]{1,6}", in: text)

        print(message.count);
        print(message)
        if let floatingLabelTextField = username as? SkyFloatingLabelTextField {
            if(message.count != 1) {
                floatingLabelTextField.errorMessage = "Please enter valid email id"
            }
            else {
                // The error message will only disappear when we reset it to nil or empty string
                floatingLabelTextField.errorMessage = ""
            }

        }
    }

    if let text = password.text {

        let message = Comman.matches(for: "^(?=.*[a-z])(?=.*[A-Z])(?=.*[!@#$%^&])(?=.*\\d).{8,16}$", in: text)

        if let floatingLabelTextField = password as? SkyFloatingLabelTextField {
            if(message.count != 1) {
                floatingLabelTextField.errorMessage = "Please enter valid Password"
            }
            else {
                // The error message will only disappear when we reset it to nil or empty string
                floatingLabelTextField.errorMessage = ""
            }

        }
    }

    if let text = firstName.text {
        let characterset = CharacterSet(charactersIn: "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLKMNOPQRSTUVWXYZ0123456789")

        if let floatingLabelTextField = firstName as? SkyFloatingLabelTextField {
        if text.rangeOfCharacter(from: characterset.inverted) != nil {
            floatingLabelTextField.errorMessage = "Please enter valid Name"
        }
        else {
                // The error message will only disappear when we reset it to nil or empty string
                floatingLabelTextField.errorMessage = ""
            }

        }
    }

    if let text = lastName.text {
        let characterset = CharacterSet(charactersIn: "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLKMNOPQRSTUVWXYZ0123456789")

        if let floatingLabelTextField = lastName as? SkyFloatingLabelTextField {
            if text.rangeOfCharacter(from: characterset.inverted) != nil {
                floatingLabelTextField.errorMessage = "Please enter valid Name"
            }
            else {
                // The error message will only disappear when we reset it to nil or empty string
                floatingLabelTextField.errorMessage = ""
            }

        }
    }
    if let text = mobileNumber.text {
        let characterset = CharacterSet(charactersIn: "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLKMNOPQRSTUVWXYZ0123456789")

        if let floatingLabelTextField = mobileNumber as? SkyFloatingLabelTextField {
            if text.rangeOfCharacter(from: characterset.inverted) != nil {
                floatingLabelTextField.errorMessage = "Please enter valid Mobile number"
            }
            else {
                // The error message will only disappear when we reset it to nil or empty string
                floatingLabelTextField.errorMessage = ""
            }

        }
    }

    return true
}

And my button like as 我的按钮就像

    @IBAction func signUpButtonPressed(_ sender: Any) {  if username.text == "" {
         if let floatingLabelTextField = username as? SkyFloatingLabelTextField {
             floatingLabelTextField.errorMessage = "Please enter UserName"
        }
    }
    if password.text == "" {
        if let floatingLabelTextField = password as? SkyFloatingLabelTextField {
            floatingLabelTextField.errorMessage = "Please enter Password"
        }
    }

    if firstName.text == "" {
        if let floatingLabelTextField = firstName as? SkyFloatingLabelTextField {
            floatingLabelTextField.errorMessage = "Please enter First Name"
        }
    }
    if lastName.text == "" {
        if let floatingLabelTextField = lastName as? SkyFloatingLabelTextField {
            floatingLabelTextField.errorMessage = "Please enter Last Name"
        }
    }
    if mobileNumber.text == "" {
        if let floatingLabelTextField = mobileNumber as? SkyFloatingLabelTextField {
            floatingLabelTextField.errorMessage = "Please enter Mobile Number"
        }
    }

} }

So how to handle it when it is valid???? 那么当它有效时如何处理呢?

You need to implement the delegate of UITextfield in that case : 在这种情况下,您需要实现UITextfield的委托:

if you want to check the each character input and want control over the text input use following method : 如果要检查每个字符输入并希望控制文本输入,请使用以下方法:

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    if textField == newPasswordTextField {
        let newString = NSString(string: textField.text!).replacingCharacters(in: range, with: string)
        let existOrNotNumber  = checkTextNumber(text: newString)
        let existOrNotSpecialCharacter  = checkSpecialCharacter(text: newString)
        let existOrNotCapitalCharacter = CapitalLetter(text: newString)
        let existOrNotlwerCharacter = lowerCaseLetter(text: newString)
        let usernameSameOrNot = checkUserName(text: newString )

        textField.text = newString;

        if existOrNotNumber {
            numericDigitLabel.textColor = kGreenColor
        }else{
            numericDigitLabel.textColor = UIColor.red
        }
        if existOrNotSpecialCharacter {
            specialCharacterLabel.textColor = kGreenColor
        }else{
            specialCharacterLabel.textColor = UIColor.red
        }
        if existOrNotCapitalCharacter{
            uppercaseCharacterLabel.textColor = kGreenColor
        }else{
            uppercaseCharacterLabel.textColor = UIColor.red
        }
        if existOrNotlwerCharacter{
            lowercaseCharacterLabel.textColor = kGreenColor
        }else{
            lowercaseCharacterLabel.textColor = UIColor.red
        }
        if (newString.characters.count) >= 8 && (newString.characters.count) <= 50 {
            minimumEightCharacterLabel.textColor = kGreenColor
        }else{
            minimumEightCharacterLabel.textColor = UIColor.red
        }
        if usernameSameOrNot{
         userNameCannotBePasslabel.textColor = kGreenColor
        }else{
         userNameCannotBePasslabel.textColor = UIColor.red
        }
        return false
    }
    return true
}

you can check every text validation here . 您可以在此处检查每个文本验证。 for validation i have created this generic function to validate . 为了验证,我创建了这个通用函数进行验证。

// MARK: - Validation for  Textfield

func isValidAllFields() -> Bool {
    var isValid = true
    var errorMessage : String = ""
    let showAndReturn : () -> Bool = { Void -> Bool in
        AppUtility.showAlert(message: errorMessage, isSuccess: false)
        return isValid
    }

    let showAndReturnWithoutToast : () -> Bool = { Void -> Bool in
        return isValid
    }

    if (oldPasswordTextField.text ?? "").isEmpty || (oldPasswordTextField.text?.trimmingCharacters(in: .whitespaces).characters.count)! == 0  {
        isValid = false
        errorMessage = kOldPasswordEmptyMessage
        return showAndReturn()
    }

    if (newPasswordTextField.text ?? "").isEmpty || (newPasswordTextField.text?.trimmingCharacters(in: .whitespaces).characters.count)! == 0  {
        isValid = false
        errorMessage = kNewPasswordEmptyMessage
        return showAndReturn()
    }

    if (confirmPasswordTextField.text ?? "").isEmpty || (confirmPasswordTextField.text?.trimmingCharacters(in: .whitespaces).characters.count)! == 0  {
        isValid = false
        errorMessage = kConfirmPasswordEmptyMessage
        return showAndReturn()
    }

    if oldPasswordTextField.text != UserDefaults.standard.object(forKey: kOldPassword) as? String {
        isValid = false
        errorMessage = kCorrectOldPasswordMessage
        return showAndReturn()
    }

    if  (newPasswordTextField.text?.characters.count)! < 8 || (newPasswordTextField.text?.characters.count)! > 50 {
        isValid = false
        return showAndReturnWithoutToast()
        // errorMessage = "New password should not be less than 8 characters and more than 50 characters"
    }

    if !checkTextNumber(text: newPasswordTextField.text!) {
         isValid = false
         return showAndReturnWithoutToast()
         // errorMessage = "New password must contain at least 1 Numeric digit"
    }

    if !checkSpecialCharacter(text: newPasswordTextField.text!) {
        isValid = false
        return showAndReturnWithoutToast()
        // errorMessage = "New password must contain at least 1 special character"
    }

    if !CapitalLetter(text: newPasswordTextField.text!) {
        isValid = false
        return showAndReturnWithoutToast()
        //errorMessage = "New password must contain at least 1 Upper case character"
    }

    if !lowerCaseLetter(text: newPasswordTextField.text!) {
        isValid = false
        return showAndReturnWithoutToast()
        // errorMessage = "New password must contain at least 1 Lower case character"
    }

    if !checkUserName(text: newPasswordTextField.text!) {
        isValid = false
        return showAndReturnWithoutToast()
    }

    if confirmPasswordTextField.text != newPasswordTextField.text{
        isValid = false
        errorMessage = kNewPassAndCofirmSameMessage
        return showAndReturn()
    }
    return isValid
}

on Button click just check if isValid() , if it return true then you allow it to pass to the next view controller 在Button上单击,只需检查isValid(),如果返回true,则允许它传递给下一个视图控制器

If you want perform checking while typing, you can use the delegate method to perform the checking: 如果要在输入时执行检查,可以使用委托方法执行检查:

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    let text = NSString(string: textField.text!).replacingCharacters(in: range, with: string)
    // Perform validation of the `text`
    if valid {
        return true
    } else {
        return false
    }
}

Or if you want to perform the checking after all the fields are filled, you can just check for the text by textField.text . 或者,如果要在所有字段都填满后执行检查,则只需通过textField.text检查文本。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM