textField Максимальная длина и проверка почтового индекса - PullRequest
0 голосов
/ 06 мая 2020

У меня есть текстовое поле для ввода канадского почтового индекса. И я использую следующий код, чтобы убедиться, что форматирование правильное, или чтобы показать предупреждение о неправильном форматировании. Это работает без проблем на saveBtnClick; но я не могу ввести это поле, поскольку оно продолжает возвращать false в текстовое поле из-за функции validZipCode. Мне также нужно убедиться, что максимальная длина символов для этого поля не превышает 7 символов, чтобы пользователь не мог ввести больше, чем семь персонажей. Я вижу много решений только для установки максимальной длины; но не могу понять, как это сделать с существующим условием, которое я упомянул здесь для проверки почтового индекса. Вот мой текущий код:

@IBOutlet weak var postalCodeTextField: UITextField!

override func viewDidLoad() {
    phoneNumberTextField.delegate = self
    postalCodeTextField.delegate = self
}

func validZipCode(postalCode:String)->String{
    let postalcodeRegex = "^[a-zA-Z][0-9][a-zA-Z][- ]*[0-9][a-zA-Z][0-9]$"
    let pinPredicate = NSPredicate(format: "SELF MATCHES %@", postalcodeRegex)
    let bool = pinPredicate.evaluate(with: postalCode) as Bool
  return bool.description
}

@IBAction func saveBtnClicked(_ sender: Any) {

    let isPostalCodeValid = validZipCode(postalCode: postalCodeTextField.text ?? "")

    if isPostalCodeValid == "false" {

        simpleAlert(title: "Error!", msg: "Please enter a valid CA postal code")

    } else
        if isPostalCodeValid == "true" {
       //the postalCaode is correct formatting
    }

}




func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
        guard let text = textField.text else { return false }
        let newString = (text as NSString).replacingCharacters(in: range, with: string)

    if textField == phoneNumberTextField {
        textField.text = formattedNumber(number: newString)
    } else

        if textField == postalCodeTextField {
            textField.text = validZipCode(postalCode: newString)
    }

    return false
}

1 Ответ

1 голос
/ 06 мая 2020

Функция validZipCode всегда будет возвращать false, если мы передадим ей один символ. Итак, подтвердите предикат, щелкнув saveButton.

class ViewController: UIViewController, UITextFieldDelegate {
    @IBOutlet weak var postalCodeTextField: UITextField!

       override func viewDidLoad() {
            postalCodeTextField.delegate = self
        }

        func validZipCode(postalCode:String)->Bool{
              let postalcodeRegex = "^[a-zA-Z][0-9][a-zA-Z][- ]*[0-9][a-zA-Z][0-9]$"
            let pinPredicate = NSPredicate(format: "SELF MATCHES %@", postalcodeRegex)
            let bool = pinPredicate.evaluate(with: postalCode) as Bool
            return bool
        }

        @IBAction func saveBtnClicked(_ sender: Any) {

            let isPostalCodeValid = validZipCode(postalCode: postalCodeTextField.text ?? "")

            if isPostalCodeValid == false {
                print("false")
               // simpleAlert(title: "Error!", msg: "Please enter a valid CA postal code")

            } else
                if isPostalCodeValid == true {
                    print("true")
               //the postalCaode is correct formatting
            }

        }

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

            let currentText = textField.text ?? ""
             guard let stringRange = Range(range, in: currentText) else { return false }

            if textField == postalCodeTextField {
                // add their new text to the existing text
                let updatedText = currentText.replacingCharacters(in: stringRange, with: string)

                // make sure the result is under 7 characters
                return updatedText.count <= 7
            }else{
                return true
            }
        }

    }

Надеюсь, это поможет !!

...