Ввести два ограничения на текстовое поле в Swift - PullRequest
0 голосов
/ 13 апреля 2020

У меня есть текстовое поле, в котором я хочу ограничить его максимальной длиной и специальными символами. Я реализовал максимальную длину, которая работает нормально, но когда я применяю ограничение специальных символов, оно не улавливает это условие, мой код:

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
if textField == firstNameTxt
    {
        guard let textFieldText = textField.text,
            let rangeOfTextToReplace = Range(range, in: textFieldText) else {
                return false
        }
        let substringToReplace = textFieldText[rangeOfTextToReplace]
        let count = textFieldText.count - substringToReplace.count + string.count
        return count <= 15

    }
else if textField == firstNameTxt
    {
        let allowedCharacters = CharacterSet(charactersIn:"+0123456789 !@#$%^&*()_+{}[]|\"<>,.~`/:;?-=\\¥'£•¢")//Here change this characters based on your requirement
        let characterSet = CharacterSet(charactersIn: string)
        return allowedCharacters.isSuperset(of: characterSet)
    }

    return true
}

Как я могу сделать оба ограничения одновременно?

1 Ответ

2 голосов
/ 13 апреля 2020

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

UITextFieldDelegate:

func textField(_ textField: UITextField,
               shouldChangeCharactersIn range: NSRange,
               replacementString string: String) -> Bool {
    if let text = textField.text,
       let textRange = Range(range, in: text) {
       let updatedText = text.replacingCharacters(in: textRange,
                                                   with: string)
       return validateString(updatedText)
    }
    return true
}

Проверка:

func validateString(_ string: String?) -> Bool {
    let regex = "^[a-zA-Z]{0,15}$"
    let predicate = NSPredicate(format:"SELF MATCHES %@", regex)
    let isValid = predicate.evaluate(with: string)
    return isValid
}

Редактировать

В регулярном выражении мы можем упомянуть диапазон символов в скобках {}. В данном сценарии мы упомянули {0,15} как диапазон.

Чтобы узнать больше о шаблонах регулярных выражений, пожалуйста, отметьте https://www.geeksforgeeks.org/write-regular-expressions/

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