Vinicius Quaiato

{tecnologia, conceitos, negócios, idéias, práticas, .NET, ruby, osx, ios e algo mais}

Fechando o teclado nas apps iOS


Quando estamos digitando algo em uma app iOS e queremos que o teclado "suma" é realmente chato se não conseguirmos fazer isso na app. Por este motivo explico aqui algumas formas de realizar isso e não frustrar a experiência do usuário.

Existem algumas formas(que eu conheço) para escondermos o teclado quando estamos editando um UITextField.

Voud descrever então cada uma das 3 maneiras que eu conheço (e que pelo que já pesquisei têm sido as mais utilizadas e indicadas).

UITextFieldDelegateProtocol

Este protocolo define quais mensagens são enviadas para um UITextField delegate no processo de edição de algum texto.

Utilizando este protocolo nós podemos esconder o teclado pressionando o botão "concluído" do teclado.

Vamos pegar nosso projeto dos gastos de rua e vamos mudá-lo.

Primeiro vamos alterar nossa arquivo ViewController.h adicionando o protocolo:

1 @interface ViewController : UIViewController<UITextFieldDelegate>
2 {
3     Gastos* gastos;
4 }

Altere apenas este ponto adicionando o UITextFieldDelegate

Feito isso vamos implementar o seguinte método no ViewController.m:

1 - (BOOL)textFieldShouldReturn:(UITextField *)textField
2 {
3     [textField resignFirstResponder];
4     return NO;
5 }

Este método diz que o UITextField deve responder ao click(tap) do botão concluído. E o que fazemos nesse código é enviar a mensagem resignFirstResponder para o nosso UITextField.

Esta mensagem diz para o textField que ele não é mais o firstResponder daquela janela, ou seja, ele não é mais quem está respondendo aos eventos (taps, touches, etc) que ocorrerem. E assim é que o teclado irá "sumir", pois o UITextField já não é mais esse responder.

Como último passo vamos informar que o delegate do nosso UITextField é o nosso view controller. Você pode fazer isso direto na interface:

Feito isso quando rodarmos nossa aplicação e pressionarmos o botão "concluído" o teclado será fechado.

UITapGestureRecognizer

UITapGestureRecognizer classe nada mais faz do que fichar "esperando" por eventos do tipo "tap" (single ou multiple taps). Com isso podemos pegar os taps que ocorrerem na nossa view e fechar o teclado aberto, vejamos como fazer isso.

Vamos então alterar nosso ViewController.m da seguinte maneira:

 1 - (void)viewDidLoad{
 2     [super viewDidLoad];
 3 
 4     gastos = [[Gastos alloc]init];
 5 
 6     UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]
 7                                    initWithTarget:self
 8                                    action:@selector(esconderTeclado)];
 9 
10     [self.view addGestureRecognizer:tap];
11 }
12 
13 -(void)esconderTeclado {
14     [valorDoGasto resignFirstResponder];
15 }

Basicamente o que estamos fazendo é criando um tap recognizer informando para ele que quem vai receber as mensagens quando os taps ocorrerem, nesse caso o próprio viewcontroller como podem ver na linha 7. Na linha 8 o que fazemos é informar um método que será chamado quando o recognizer reconhecer um tap. Neste caso o método é o esconderTeclado que criamos nas linhas 13 a 15. Na linha 10 novamente enviamos a mensagem de resignFirstResponder ao nosso UITextField.

TouchesBegan

A terceira forma - e ao que parece uma das mais utilizadas - é fazer um override do método touchesBegan.

Este método informa quando um ou mais toques sào feitos em uma window ou view.

Neste caso o que faremos é simplesmente enviar a mensagem resignFirstResponder quando um toque na view for feito:

1 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
2 {
3     [valorDoGasto resignFirstResponder];
4 
5     [super touchesBegan:touches withEvent:event];
6 }

Bastante simples. A única coisa diferente aqui é repassar o evento para a classe base na linha 5 após fazermos o que precisávamos fazer na linha 3.

Resumindo

Estas são as três maneiras que eu conheço para fazermos o "teclado sumir" enquanto estivermos trabalhando com UITextFields.

O código do projeto de gastos de rua já está atualizado no github com essas melhorias.

Abraços,

Vinicius Quaiato.

Voltar

Fork me on GitHub