Eu tenho usado esse protocolo / extensão em um dos meus aplicativos e é um pouco mais legível. Eu gosto de como ele reconhece backspaces e explicitamente diz quando um personagem é um backspace.
Algumas coisas a considerar:
1. O que implementa essa extensão de protocolo precisa especificar um limite de caracteres.Esse normalmente é o seu ViewController, mas você pode implementar o limite de caracteres como uma propriedade calculada e retornar outra coisa, por exemplo, um limite de caracteres em um dos seus modelos.
2. Você precisará chamar esse método dentro do método delegado shouldChangeCharactersInRange do seu campo de texto. Caso contrário, você não poderá bloquear a entrada de texto retornando false etc.
3. Você provavelmente desejará permitir caracteres de backspace. Por isso, adicionei a função extra para detectar backspaces. Seu método shouldChangeCharacters pode verificar isso e retornar 'true' desde o início para permitir sempre backspaces.
protocol TextEntryCharacterLimited{
var characterLimit:Int { get }
}
extension TextEntryCharacterLimited{
func charactersInTextField(textField:UITextField, willNotExceedCharacterLimitWithReplacementString string:String, range:NSRange) -> Bool{
let startingLength = textField.text?.characters.count ?? 0
let lengthToAdd = string.characters.count
let lengthToReplace = range.length
let newLength = startingLength + lengthToAdd - lengthToReplace
return newLength <= characterLimit
}
func stringIsBackspaceWith(string:String, inRange range:NSRange) -> Bool{
if range.length == 1 && string.characters.count == 0 { return true }
return false
}
}
Se algum de vocês estiver interessado, eu tenho um repositório do Github em que peguei parte desse comportamento de limite de caracteres e coloquei em uma estrutura iOS. Existe um protocolo que você pode implementar para obter uma exibição de limite de caracteres semelhante ao Twitter que mostra até que ponto você ultrapassou o limite de caracteres.
Framework CharacterLimited no Github