Pregunta

Tengo una UITextField en una clase MyCustomUIView y cuando el UITextField pierde el foco, me gustaría ocultar el campo y mostrar otra cosa en su lugar.

El delegado para la UITextField se establece en MyCustomUIView vía EB y también tengo 'puso fin al salir' y 'Edición puso fin a' eventos que apuntan a un método IBAction dentro MyCustomUIView.

@interface MyCustomUIView : UIView { 

IBOutlet UITextField    *myTextField;

}

-(IBAction)textFieldLostFocus:(UITextField *)textField;

@end

Sin embargo, ninguno de estos acontecimientos parecen ser despedido cuando el UITextField pierde el foco. ¿Cómo se trampa / mira para este evento?

El delegado para la UITextField se establece como MyCustomUIView así que estoy recibiendo mensajes textFieldShouldReturn para ocultar el teclado cuando haya terminado.

Pero lo que también me interesa es averiguar cuando el usuario pulsa alguna otra área en la pantalla (por ejemplo otro control o simplemente área en blanco) y el campo de texto se ha perdido el foco.

¿Fue útil?

Solución

Creo que necesita para designar a la vista como delegado UITextField este modo:

@interface MyCustomUIView : UIView <UITextFieldDelegate> { 

Como bono adicional, esta es la forma de obtener el teclado desaparezca cuando presionan el "hecho" o regresar botones, dependiendo de cómo se haya establecido que la propiedad:

- (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;
}

Otros consejos

Trate de usar delegado por el siguiente método:

- (BOOL) textFieldShouldEndEditing:(UITextField *)textField {
    NSLog(@"Lost Focus for content: %@", textField.text);
    return YES;
}

Eso funcionó para mí.

El problema con el solución resignFirstResponder únicamente es decir, que sólo puede ser activado por una explícita Teclado o UITextField evento. Yo también estaba buscando un "evento de foco perdida" para ocultar el teclado, si en algún lugar fuera del campo de texto se dio un golpecito en. La única "solución" estrecha y práctica me encontré es decir, para desactivar las interacciones de otros puntos de vista hasta que el usuario ha terminado con la edición (golpear hecho / retorno en el teclado), pero aún sea capaz de saltar entre los campos de texto para hacer correcciones sin la necesidad de deslizarse hacia fuera y en el cada vez de teclado.

El siguiente fragmento que puede resultar útil a alguien, que quiere hacer lo mismo:

// 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;
}

Puede que tenga que subclase el UITextField y anular resignFirstResponder. resignFirstResponder se llamará igual que el campo de texto está perdiendo el foco.

creo que haya implementado UIKeyboardDidHideNotification y en este caso usted

utilice un código como

[theTextField resignFirstResponder];

eliminar este código.

También mismo código de escritura en el método textFieldShouldReturn. este enfoque también se pierde.

Para aquellos que luchan con esto en Swift. Añadimos un reconocedor gesto a la opinión del ViewController de modo que cuando se toca el punto de vista descartamos el campo de texto. Es importante no cancelar los clics posteriores en la vista.

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 bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top