我们有一个具有一定数量的用户的实时应用程序。 在即将进行的更新中,我们需要添加姓名输入限制(少于 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
}