Примените ограничения UITextField к локально сохраненному тексту UITextField - PullRequest
0 голосов
/ 11 февраля 2020

У нас есть живое приложение с определенным количеством пользователей. В следующем обновлении нам нужно добавить ограничения на ввод имени и фамилии (длиной не более 25 символов и без пробелов, цифр и т. Д. c.)

Вот как я это делаю:

    func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    if textField == surnameTextField, textField == nameTextField {
        let currentText = textField.text ?? ""
        guard let stringRange = Range(range, in: currentText) else { return false }
        let updatedText = currentText.replacingCharacters(in: stringRange, with: string)
        let allowedCharacters = CharacterSet.letters
        let finalCaracterSet = CharacterSet(charactersIn: updatedText)
        return updatedText.count <= 25 && allowedCharacters.isSuperset(of: finalCaracterSet)
    }
    return true
}

Все работает как положено, кроме одного. Что если у нас уже есть пользователи, у которых есть цифры или символы в их именах / фамилиях? (Пользовательские данные хранятся локально)? Они не смогут изменить свое имя / фамилию.

Как разрешить существующим пользователям редактировать свои учетные данные после этого обновления?

Например, в случае имени Emma_Lew приведенный выше код всегда будет возвращать false, поскольку allowedCharacters.isSuperset(of: finalCaracterSet) - false (содержит подчеркивание).

1 Ответ

2 голосов
/ 11 февраля 2020

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

Замените свой код следующим кодом

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
   if textField == surnameTextField, textField == nameTextField {
        let currentText = textField.text ?? ""
        guard let stringRange = Range(range, in: currentText) else { return false }
        let updatedText = currentText.replacingCharacters(in: stringRange, with: string)
        let allowedCharacters = CharacterSet.letters
        let finalCaracterSet = CharacterSet(charactersIn: string)
        return updatedText.count <= 25 && allowedCharacters.isSuperset(of: finalCaracterSet)
    }
    return true
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...