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

Apply UITextField restrictions to locally saved UITextField text

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

除一件事外,一切都按预期工作。 如果我们已经有用户,他们的 names/surnames 中有数字或符号怎么办? (用户数据存储在本地)?他们将无法更改 name/surname。

如何让现有用户在此更新后编辑他们的凭据?

例如,在 Emma_Lew name 的情况下,上面的代码将始终 return false,因为 allowedCharacters.isSuperset(of: finalCaracterSet) 是 false(包含下划线)。

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

用以下代码替换您的代码

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
}