UITextField evento perder o foco
-
16-09-2019 - |
Pergunta
Eu tenho um UITextField em uma classe MyCustomUIView e quando o UITextField perde o foco, eu gostaria de ocultar o campo e mostrar outra coisa no lugar.
O delegado para a UITextField
está definido para MyCustomUIView
via IB e também tenho 'acabou No Exit' e 'Edição acabou' eventos que apontam para um método IBAction
dentro MyCustomUIView
.
@interface MyCustomUIView : UIView {
IBOutlet UITextField *myTextField;
}
-(IBAction)textFieldLostFocus:(UITextField *)textField;
@end
No entanto, nenhum desses eventos parecem ser demitido quando o UITextField perde o foco. Como você armadilha / olhar para este evento?
O delegado para a UITextField
é definido como MyCustomUIView
então eu estou recebendo mensagem textFieldShouldReturn
para descartar o teclado quando feito.
Mas o que eu também estou interessado em é descobrir quando o usuário pressiona alguma outra área na tela (dizer outro controle ou área apenas em branco) e o campo de texto tem o foco perdido.
Solução
Eu acredito que você precisa para designar a sua visão como um delegado UITextField assim:
@interface MyCustomUIView : UIView <UITextFieldDelegate> {
Como um bônus adicional, este é como você começa o teclado para ir embora quando eles pressionam o "feito" ou retorno botões, dependendo de como você definir essa propriedade:
- (BOOL)textFieldShouldReturn:(UITextField *)theTextField {
//This line dismisses the keyboard.
[theTextField resignFirstResponder];
//Your view manipulation here if you moved the view up due to the keyboard etc.
return YES;
}
Outras dicas
Tente usar delegado para o método seguinte:
- (BOOL) textFieldShouldEndEditing:(UITextField *)textField {
NSLog(@"Lost Focus for content: %@", textField.text);
return YES;
}
Isso funcionou para mim.
O problema com o resignFirstResponder solução apenas é que ele só pode ser desencadeada por um explícita teclado ou UITextField evento. Eu também estava procurando um "evento de foco perdido" para ocultar o teclado, se em algum lugar fora do campo de texto foi aproveitado por diante. A "solução" única perto e prático me deparei é, para desabilitar interações para outros pontos de vista até que o usuário é terminado com a edição (bater feito / retorno sobre o teclado), mas ainda ser capaz de saltar entre os campos de texto para fazer correções sem a necessidade de correr para fora e na toda teclado.
O seguinte trecho talvez útil para alguém, quem quer fazer a mesma coisa:
// disable all views but textfields
// assign this action to all textfields in IB for the event "Editing Did Begin"
-(IBAction) lockKeyboard : (id) sender {
for(UIView *v in [(UIView*)sender superview].subviews)
if (![v isKindOfClass:[UITextField class]]) v.userInteractionEnabled = NO;
}
// reenable interactions
// assign this action to all textfields in IB for the event "Did End On Exit"
-(IBAction) disMissKeyboard : (id) sender {
[(UIResponder*)sender resignFirstResponder]; // hide keyboard
for(UIView *v in [(UIView*)sender superview].subviews)
v.userInteractionEnabled = YES;
}
Você pode ter a subclasse o UITextField
e override resignFirstResponder
. resignFirstResponder
será chamado assim como o campo de texto é perder o foco.
eu acho que você implementou UIKeyboardDidHideNotification
e neste caso de você
código de uso como
[theTextField resignFirstResponder];
remover esse código.
Também mesma gravação código no método textFieldShouldReturn
. este foco também perdeu.
Para aqueles que lutam com isso em Swift. Nós adicionamos um reconhecedor de gestos para a vista do ViewController de modo que quando a visão é aproveitado nós demitir o campo de texto. É importante não cancelar os cliques subsequentes no modo de exibição.
Swift 2.3
override func viewDidLoad() {
//.....
let viewTapGestureRec = UITapGestureRecognizer(target: self, action: #selector(handleViewTap(_:)))
//this line is important
viewTapGestureRec.cancelsTouchesInView = false
self.view.addGestureRecognizer(viewTapGestureRec)
//.....
}
func handleViewTap(recognizer: UIGestureRecognizer) {
myTextField.resignFirstResponder()
}