将 UITextField 限制应用于本地保存的 UITextField 文本



我们有一个具有一定数量的用户的实时应用程序。 在即将进行的更新中,我们需要添加姓名输入限制(少于 25 个字符,并且没有空格、数字等(

这是我的做法:

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)是假的(包含下划线(。

您不必在最终字符集中添加整个文本,只需添加新字符串即可获得所需的结果。

将代码替换为以下代码

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
}