First Responder é o objeto UIResponder no iOS que recebe primeiro os eventos de toque, pressionamentos de tecla, gestos de agitação e comandos de menu. Em qualquer momento, apenas um objeto no aplicativo pode ser first responder. A atribuição ocorre automaticamente (quando um UITextField ganha foco) ou programaticamente através do método becomeFirstResponder. De acordo com a Documentação para Desenvolvedores Apple (2026), um objeto pode se tornar first responder apenas se seu método canBecomeFirstResponder retornar true, tornando esse mecanismo explícito e controlável.
Principais pontos
First Responder é o objeto UIResponder que atualmente recebe eventos de entrada em um aplicativo iOS. O sistema direciona todos os eventos de toque, pressionamentos de tecla, eventos de movimento (agitação do dispositivo) e mensagens de ação (por exemplo, invocar um menu de contexto) para este objeto.
O conceito de first responder é o primeiro elo na Cadeia de Respondedores (Responder Chain). Se o first responder não tratar um evento recebido, ele é automaticamente passado para o próximo objeto na cadeia. Isso garante que um evento não seja perdido, mas seja oferecido sequencialmente a todos os manipuladores potenciais na hierarquia.
Segundo a Apple, o status de first responder está intimamente ligado ao UIResponder e seus métodos canBecomeFirstResponder e becomeFirstResponder. Por padrão, UIView retorna true apenas para certas subclasses — UITextField, UITextView, UISearchBar. Outras visualizações, incluindo UIView simples, retornam false, evitando atribuição acidental.
A atribuição de first responder pode ocorrer de duas maneiras: automaticamente, quando o usuário toca em um UITextField (o sistema chama becomeFirstResponder internamente), ou programaticamente, quando o desenvolvedor chama explicitamente o método becomeFirstResponder em qualquer objeto UIResponder.
Antes da atribuição, o iOS verifica canBecomeFirstResponder. Se o método retornar false, a chamada becomeFirstResponder é ignorada e o objeto não se torna first responder. Este é um mecanismo de proteção que impede a atribuição de objetos que não estão prontos para manipular eventos — por exemplo, elementos de interface ocultos ou desabilitados.
class CustomTextField: UITextField {
override var canBecomeFirstResponder: Bool {
return super.canBecomeFirstResponder
}
}
// Atribuição programática
textField.becomeFirstResponder()
// Verificar se é first responder
if textField.isFirstResponder {
print("TextField agora é first responder")
}
Quando um novo first responder é atribuído, o iOS chama automaticamente resignFirstResponder no anterior. Isso garante que haja sempre apenas um objeto com status de first responder no sistema. Se o novo objeto não puder se tornar first responder (canBecomeFirstResponder = false), o antigo mantém seu status.
O teclado do iOS aparece na tela precisamente por causa do mecanismo de first responder. Quando um UITextField ou UITextView se torna first responder, o sistema exibe automaticamente o teclado associado ao keyboardType atual desse campo. Quando o first responder renuncia, o teclado é ocultado.
Este comportamento é um mecanismo UX fundamental no iOS: o usuário toca em um campo de entrada — o teclado aparece; pressiona Return ou toca em outro campo — o teclado alterna ou é ocultado. O desenvolvedor pode controlar isso através dos métodos UIResponder, bem como através de inputView e inputAccessoryView para substituir o teclado padrão por um personalizado.
Input Accessory View é um painel adicional acima do teclado que também está vinculado ao first responder. Por exemplo, um painel com botões Next, Previous, Done para navegar entre campos de entrada. Ele aparece e é ocultado junto com o teclado, sincronizando com o status de first responder.
| Evento | Status de first responder | Teclado |
|---|---|---|
| Tocar em UITextField | Torna-se first responder | Aparece |
| Pressionar Return | Permanece ou renuncia | Permanece ou é ocultado |
| Tocar em outro campo | Passa para o novo campo | Alterna |
| Chamar resignFirstResponder | Removido | É ocultado |
| Aplicativo em segundo plano | Renuncia automaticamente | É ocultado |
ResignFirstResponder é um método UIResponder que remove o status de first responder de um objeto. Após a chamada, o objeto para de receber eventos de entrada e o teclado (se estava ativo) é ocultado. O método retorna um Bool — true se a renúncia foi bem-sucedida.
Os desenvolvedores costumam chamar resignFirstResponder em resposta ao pressionar o botão Done, tocar em uma área vazia da tela (view.endEditing) ou ao sair da tela. view.endEditing(true) é uma maneira conveniente de renunciar para todos os campos de texto filhos de uma vez: ele percorre toda a hierarquia de visualização e chama resignFirstResponder no first responder atual.
// Renunciar ao tocar no botão Done
@objc func doneButtonTapped() {
textField.resignFirstResponder()
}
// Renunciar ao tocar em área vazia
override func touchesBegan(
_ touches: Set<UITouch>,
with event: UIEvent?
) {
view.endEditing(true)
}
// Renunciar para todos os campos do formulário
func validateAndSubmit() {
view.endEditing(true)
// Lógica de envio do formulário
}
Existem situações em que resignFirstResponder pode retornar false. Isso acontece se o objeto sobrescreveu o método e proibiu explicitamente a remoção do status. Por exemplo, um campo de texto em processo de validação pode bloquear temporariamente a renúncia para evitar perda de dados. Nesses casos, aguarde a conclusão da validação e só então renuncie à força.
UIResponder fornece a propriedade isFirstResponder (somente leitura), que retorna true se o objeto fornecido for atualmente o first responder. Isso é útil para lógica condicional — por exemplo, para evitar executar uma ação se um campo de texto estiver focado e o usuário estiver inserindo dados.
O iOS não fornece uma API integrada para obter o first responder atual em escala de aplicativo inteiro. Os desenvolvedores conseguem isso percorrendo a hierarquia de visualizações usando o método UIResponder. A Apple recomenda uma referência fraca (weak reference) ao first responder, que pode ser atualizada via KVO ou delegados.
// Extensão para encontrar first responder
extension UIView {
var firstResponder: UIResponder? {
guard isFirstResponder else {
return subviews.compactMap { $0.firstResponder }.first
}
return self
}
}
// Uso
if let current = view.firstResponder {
print("Current first responder: \(current)")
}
Para rastrear alterações no first responder, você pode se inscrever em UIResponder.keyboardWillShowNotification e UIResponder.keyboardWillHideNotification — eles indicam indiretamente que algum objeto de texto se tornou ou deixou de ser o first responder. No entanto, não existe inscrição direta para alterações de isFirstResponder; KVO ou delegados personalizados são usados.
Visualizações personalizadas podem se tornar first responder se sobrescreverem canBecomeFirstResponder e retornarem true. Isso é necessário para componentes que precisam receber eventos de teclado ou botões físicos — como controladores de jogo personalizados ou editores de código baseados em UITextView.
Ao criar um first responder personalizado, é importante considerar a acessibilidade: VoiceOver e Switch Control dependem da atribuição correta do first responder para navegação. Se uma visualização personalizada se tornar first responder, ela deve implementar corretamente o protocolo UIAccessibility e informar seu status às tecnologias assistivas.
Para entrada personalizada (por exemplo, um leitor de código de barras ou teclado numérico), sobrescreva a propriedade inputView — retorne uma UIView personalizada que será exibida em vez do teclado padrão quando esta visualização for first responder. Da mesma forma, inputAccessoryView adiciona um painel acima do teclado.
Perguntas frequentes
First Responder é o objeto UIResponder que atualmente recebe eventos de entrada (toque, teclas, acelerômetro). É atribuído através de becomeFirstResponder e deve retornar true de canBecomeFirstResponder. Apenas um objeto pode ser first responder em um aplicativo.
Chame textField.becomeFirstResponder() programaticamente, por exemplo, em viewDidAppear. Certifique-se de que textField não esteja oculto, userInteractionEnabled = true e isEnabled = true. Se o campo estiver dentro de um UITableView ou UICollectionView, certifique-se de que a célula esteja visível na tela.
Adicione um UITapGestureRecognizer à visualização principal e chame view.endEditing(true) em seu manipulador. Isso encontrará automaticamente o first responder atual e chamará resignFirstResponder. Alternativamente, sobrescreva touchesBegan em UIViewController com uma chamada a endEditing.
becomeFirstResponder retorna false se canBecomeFirstResponder retornar false, a visualização estiver oculta, não estiver na hierarquia da janela ou userInteractionEnabled = false. Verifique também se a visualização foi adicionada à janela — uma visualização que não está na tela não responderá a becomeFirstResponder.
O iOS não fornece uma API global para isso. Use um percurso recursivo da hierarquia de visualização através de uma extensão UIView que verifica isFirstResponder em cada subvisualização. Uma alternativa é armazenar uma referência fraca ao último first responder no AppDelegate e atualizá-la através de delegados UITextField.
Resumo
Vamos desenvolver um aplicativo móvel chave na mão
A IT Sectr cria aplicativos para iOS e Android para startups e empresas desde 2017. Nós vamos aconselhá-lo e propor a melhor solução.
Leia também