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.

Foi útil?

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()
    }
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top