Com o Swift 5 e o iOS 12, tente a seguinte implementação do textField(_:shouldChangeCharactersIn:replacementString:)
método que faz parte do UITextFieldDelegate
protocolo:
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
guard let textFieldText = textField.text,
let rangeOfTextToReplace = Range(range, in: textFieldText) else {
return false
}
let substringToReplace = textFieldText[rangeOfTextToReplace]
let count = textFieldText.count - substringToReplace.count + string.count
return count <= 10
}
- A parte mais importante desse código é a conversão de
range
( NSRange
) para rangeOfTextToReplace
( Range<String.Index>
). Veja este tutorial em vídeo para entender por que essa conversão é importante.
- Para fazer este trabalho de código corretamente, você também deve definir o
textField
's smartInsertDeleteType
valor a UITextSmartInsertDeleteType.no
. Isso impedirá a possível inserção de um espaço extra (indesejado) ao executar uma operação de colagem.
O código de exemplo completo abaixo mostra como implementar textField(_:shouldChangeCharactersIn:replacementString:)
em um UIViewController
:
import UIKit
class ViewController: UIViewController, UITextFieldDelegate {
@IBOutlet var textField: UITextField! // Link this to a UITextField in Storyboard
override func viewDidLoad() {
super.viewDidLoad()
textField.smartInsertDeleteType = UITextSmartInsertDeleteType.no
textField.delegate = self
}
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
guard let textFieldText = textField.text,
let rangeOfTextToReplace = Range(range, in: textFieldText) else {
return false
}
let substringToReplace = textFieldText[rangeOfTextToReplace]
let count = textFieldText.count - substringToReplace.count + string.count
return count <= 10
}
}
text.characters.count
é o uso obsoletotext.count
Eu faço assim:
O código funciona para mim. Mas eu trabalho com storyboard. No Storyboard, adiciono uma ação para o campo de texto no controlador de exibição na edição alterada .
fonte
Atualização para Swift 4
fonte
Adicione mais detalhes da resposta @Martin
fonte
Em Swift 4
Limite de 10 caracteres para o campo de texto e permite excluir (backspace)
fonte
uma pequena mudança para o IOS 9
fonte
Swift 3
fonte
você pode estender o UITextField e adicionar um
@IBInspectable
objeto para lidar com isso:SWIFT 5
e depois defini-lo no inspetor de atributos
Ver resposta original do Swift 4
fonte
Se você deseja sobrescrever a última letra:
fonte
Postei uma solução usando
IBInspectable
, para que você possa alterar o valor do comprimento máximo no criador de interface ou programaticamente. Confira aquifonte
Você pode usar no swift 5 ou swift 4 como a imagem se parece abaixo
adicione o código na view ViewController
Você pode fazer o download do formulário de código-fonte completo do GitHub: https://github.com/enamul95/TextFieldMaxLen
fonte
Cuidado com o bug de desfazer do UITextField mencionado neste post: Defina o comprimento máximo de caracteres de um UITextField
aqui está como você o corrige rapidamente
fonte
fonte
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.
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
fonte
Como os delegados são um relacionamento 1 para 1 e talvez eu queira usá-lo em outro local por outros motivos, gosto de restringir o tamanho do campo de texto adicionando esse código em sua configuração:
fonte
Estou usando isso;
Limite de 3 caracteres
fonte
Swift 5
fonte
Você precisa verificar se a cadeia existente mais a entrada é maior que 10.
fonte