Como capturar a alteração de texto em UITextField: melhores práticas 2025

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Introdução: Por que "capturar" a alteração de texto é o básico?

\n\n

Imagine: 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\n

Em 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\n

Em 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\n

Vamos nessa! 🚀

\n\n

Método 1. Target-Action: Antigo, mas funcional

\n\n

O método mais simples e direto, que funciona desde o iOS 2.0. Sim, ele tem mais de 15 anos, mas ainda é relevante.

\n\n

A 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.

\n\n

Exemplo de código (UIKit + Storyboard ou código)

\n\n
import 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\n

Vantagens: mínimo de código, não requer assinatura de protocolos, funciona rapidamente.

\n

Desvantagens: 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).

\n\n

Método 2. Delegado UITextFieldDelegate: Controle sobre cada caractere

\n\n

Se 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\n

Aqui, o método chave é textField(_:shouldChangeCharactersIn:replacementString:). Ele é chamado antes de o texto realmente ser alterado.

\n\n

Exemplo: formatação de número de telefone

\n\n
import 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                

Blogs

Book Recommendations