{tecnologia, conceitos, negócios, idéias, práticas, .NET, ruby, osx, ios e algo mais}
02/06/2012
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
2
3
4
@interface ViewController : UIViewController<UITextFieldDelegate>
{
Gastos* gastos;
}
Altere apenas este ponto adicionando o UITextFieldDelegate
Feito isso vamos implementar o seguinte método no ViewController.m:
1
2
3
4
5
- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
[textField resignFirstResponder];
return NO;
}
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
- (void)viewDidLoad{
[super viewDidLoad];
gastos = [[Gastos alloc]init];
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]
initWithTarget:self
action:@selector(esconderTeclado)];
[self.view addGestureRecognizer:tap];
}
-(void)esconderTeclado {
[valorDoGasto resignFirstResponder];
}
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
2
3
4
5
6
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
[valorDoGasto resignFirstResponder];
[super touchesBegan:touches withEvent:event];
}
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.