Introdução: Por que "capturar" a alteração de texto é o básico?
\n\nImagine: você está escrevendo um aplicativo para busca de receitas. O usuário começa a digitar "massa" e sua busca deve disparar instantaneamente, sem apertar um botão. Ou você está fazendo um formulário de registro, onde precisa destacar o erro "senha muito curta" assim que o usuário digitar a terceira letra.
\n\nEm ambos os casos, você precisa saber o momento exato em que o texto no UITextField mudou. Esta pergunta no Stack Overflow acumulou milhares de visualizações — e não é à toa. Todo desenvolvedor iOS, mais cedo ou mais tarde, se depara com isso.
\n\nEm 2025, temos pelo menos 4 maneiras de resolver este problema. Algumas são veteranas, testadas pelo tempo. Outras são abordagens recentes que a Apple promove ativamente. Neste artigo, vamos analisar todas as opções, do clássico ao moderno, e mostrarei qual método escolher para cada tarefa específica.
\n\nVamos nessa! 🚀
\n\nMétodo 1. Target-Action: Antigo, mas funcional
\n\nO método mais simples e direto, que funciona desde o iOS 2.0. Sim, ele tem mais de 15 anos, mas ainda é relevante.
\n\nA ideia é que UITextField herda de UIControl e, portanto, pode gerar eventos. O que nos interessa é o evento .editingChanged — ele é disparado a cada alteração no texto.
Exemplo de código (UIKit + Storyboard ou código)
\n\nimport UIKit\n\nclass ViewController: UIViewController {\n\n @IBOutlet weak var searchTextField: UITextField!\n\n override func viewDidLoad() {\n super.viewDidLoad()\n // Adiciona um alvo para o evento de alteração de texto\n searchTextField.addTarget(self,\n action: #selector(textFieldDidChange(_:)),\n for: .editingChanged)\n }\n\n @objc func textFieldDidChange(_ textField: UITextField) {\n guard let text = textField.text else { return }\n print("Texto alterado: \\(text)")\n // Aqui pode fazer busca, validação, etc.\n }\n}\n\nVantagens: mínimo de código, não requer assinatura de protocolos, funciona rapidamente.
\nDesvantagens: precisa usar @objc — isso é legacy Swift. Não oferece controle refinado (por exemplo, não é possível distinguir inserção de texto de exclusão).
Método 2. Delegado UITextFieldDelegate: Controle sobre cada caractere
\n\nSe você precisa não apenas saber que o texto mudou, mas influenciar a mudança (bloquear entrada, formatar número de telefone), então o delegate é sua escolha.
\n\nAqui, o método chave é textField(_:shouldChangeCharactersIn:replacementString:). Ele é chamado antes de o texto realmente ser alterado.
Exemplo: formatação de número de telefone
\n\nimport UIKit\n\nclass ViewController: UIViewController, UITextFieldDelegate {\n\n @IBOutlet weak var phoneTextField: UITextField!\n\n override func viewDidLoad() {\n super.viewDidLoad()\n phoneTextField.delegate = self\n }\n\n func textField(_ textField: UITextField,\n shouldChangeCharactersIn range: NSRange,\n replacementString string: String) -> Bool {\n\n // Permite apenas dígitos\n let allowedCharacters = CharacterSet.decimalDigits\n let characterSet = CharacterSet(charactersIn: string)\n guard allowedCharacters.isSuperset(of: characterSet) else {\n return false\n }\n\n // Limita o comprimento a 10 caracteres\n let currentText = textField.text ?? ""\n guard let stringRange = Range(range, in: currentText) else { return false }\n let updatedText = currentText.replacingCharacters(in: stringRange, with: string)\n return updatedText.count <= 10\n }\n\n // Adicionalmente: captura o momento em que o texto já foi alterado\n func textFieldDidChangeSelection(_ textField: UITextField) {\n print("Texto atualizado: \\(textFi