Pregunta

Sé que necesito decirle a mi UITextField que renuncie al primer respondedor cuando quiero cerrar el teclado, pero no estoy seguro de cómo saber cuándo el usuario ha presionado el botón "Listo". tecla en el teclado. ¿Hay alguna notificación que pueda ver?

¿Fue útil?

Solución

Configuré el delegado del UITextField en mi clase ViewController .

En esa clase implementé este método de la siguiente manera:

- (BOOL)textFieldShouldReturn:(UITextField *)textField {
    [textField resignFirstResponder];
    return NO;
}

Otros consejos

Si conecta el evento DidEndOnExit del campo de texto a una acción (IBAction) en InterfaceBuilder, se le enviará un mensaje cuando el usuario cierre el teclado (con la tecla de retorno) y el remitente será una referencia al UITextField que se activó el evento.

Por ejemplo:

-(IBAction)userDoneEnteringText:(id)sender
{
    UITextField theField = (UITextField*)sender;
    // do whatever you want with this text field
}

Luego, en InterfaceBuilder, vincule el evento DidEndOnExit del campo de texto a esta acción en su controlador (o lo que sea que esté utilizando para vincular eventos desde la IU). Cada vez que el usuario ingresa texto y cierra el campo de texto, el controlador recibirá este mensaje.

También puede crear un método en su controlador

 -(IBAction)editingEnded:(id)sender{
    [sender resignFirstResponder]; 
}

y luego en Connection Inspector en IB connect Event " Did End On Exit " a ello.

kubi, gracias. Tu código funcionó. Solo para ser explícito (para novatos como), ya que dice que debe configurar el UITextField ' delegate para que sea igual al ViewController en el que reside el campo de texto. Puedes hacer esto donde quieras. Elegí el método viewDidLoad .

- (void)viewDidLoad 
{
    // sets the textField delegates to equal this viewController ... this allows for the keyboard to disappear after pressing done
    daTextField.delegate = self;
}

Aquí hay un truco para obtener un comportamiento de descarte automático del teclado sin ningún código. En el plumín, edite el objeto proxy Primer respondedor en el inspector de identidad, agregando una nueva acción de primer respondedor; vamos a llamarlo dummy: . Ahora conecte el evento Did End on Exit del campo de texto a la acción dummy: del objeto proxy First Responder. ¡Eso es! Dado que el evento Did End on Exit del campo de texto ahora tiene una acción & # 8211; par objetivo, el campo de texto descarta automáticamente su teclado cuando el usuario toca Retorno; y dado que no hay penalización por no encontrar un controlador para un mensaje enviado por la cadena de respuesta, la aplicación no se bloquea a pesar de que no hay implementación de dummy: en ninguna parte.

Solo agrega

[textField endEditing:YES];

donde desea deshabilitar el teclado y mostrar la vista del selector.

En Swift puede escribir una IBAction en el controlador y configurar el evento Terminó al salir del campo de texto para esa acción

@IBAction func returnPressed(sender: UITextField) {
    self.view.endEditing(true)
}

También puedes usar

 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
  {

   [self.yourTextField resignFirstResponder];

  }

Mejor si tienes muchos Uitextfields:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
 {    
     [self.view endEditing:YES];
 }

Esto es lo que tuve que hacer para que funcione, y creo que es necesario para cualquier persona con un teclado numérico para un teclado (o cualquier otro sin un botón listo:

  1. Cambié la vista UIView en ViewController a UIControl.
  2. Creé una función llamada

    -(IBAction)backgroundIsTapped:(id)sender
    

Esto también se definió en el archivo .h.

Después de esto, me vinculé al bit 'touchdown' para ViewController en Interface Builder.

En la función 'el fondo está tocado', pongo esto:

    [answerField resignFirstResponder];

Solo recuerde cambiar 'answerField' por el nombre del UITextField del que desea quitar el teclado (obviamente asegúrese de que su UITextField esté definido como se muestra a continuación :)

    IBOutlet UITextField * <nameoftextfieldhere>;

Sé que este tema probablemente murió hace mucho tiempo ... ¡pero espero que esto ayude a alguien, en algún lugar!

Notará que el método & text; textFieldShouldReturn " proporciona el objeto de campo de texto que ha pulsado la tecla HECHO. Si configura el TAG, puede activar ese campo de texto. O puede rastrear y comparar el puntero del objeto con algún valor de miembro almacenado por su creador.

Mi enfoque es así para un autoestudio:

- (BOOL)textFieldShouldReturn:(UITextField *)textField {
    NSLog(@"%s", __FUNCTION__);

    bool fDidResign = [textField resignFirstResponder];

    NSLog(@"%s: did %resign the keyboard", __FUNCTION__, fDidResign ? @"" : @"not ");

    return fDidResign;
}

Mientras tanto, pongo la "validación" Prueba que niega la dimisión sigue. Es solo para ilustración, así que si el usuario escribe NO! en el campo, no se despedirá. El comportamiento fue el que quería, pero la secuencia de salida no fue la que esperaba.

- (BOOL)textFieldShouldEndEditing:(UITextField *)textField {
    NSLog(@"%s", __FUNCTION__);

    if( [[textField text] isEqualToString:@"NO!"] ) {
        NSLog(@"%@", textField.text);
        return NO;
    } else {
        return YES;
    }
}

A continuación se muestra mi salida NSLog para esta denegación seguida de la aceptación. ¿Te darás cuenta de que estoy devolviendo el resultado de la renuncia, pero esperaba que me devolviera FALSO para informar a la persona que llama? Aparte de eso, tiene el comportamiento necesario.

13.313 StudyKbd[109:207] -[StudyKbdViewController textFieldShouldReturn:]
13.320 StudyKbd[109:207] -[StudyKbdViewController textFieldShouldEndEditing:]
13.327 StudyKbd[109:207] NO!
13.333 StudyKbd[109:207] -[StudyKbdViewController textFieldShouldReturn:]: did resign the keyboard
59.891 StudyKbd[109:207] -[StudyKbdViewController textFieldShouldReturn:]
59.897 StudyKbd[109:207] -[StudyKbdViewController textFieldShouldEndEditing:]
59.917 StudyKbd[109:207] -[StudyKbdViewController doneEditText]: NO
59.928 StudyKbd[109:207] -[StudyKbdViewController textFieldShouldReturn:]: did resign the keyboard

Aquí hay una forma bastante limpia de finalizar la edición con la tecla de retorno o un toque de fondo.

En el generador de interfaces, incruste sus campos en una vista de la clase UIFormView

¿Qué significa esta clase:

  • Se adjunta automáticamente como delegado de campos (Despertado de la punta o agregado manualmente)
  • Mantener una referencia en el campo editado actual
  • Descarte el teclado al regresar o toque en segundo plano

Aquí está el código:

Interfaz

#import <UIKit/UIKit.h>

@interface UIFormView : UIView<UITextFieldDelegate>

-(BOOL)textFieldValueIsValid:(UITextField*)textField;
-(void)endEdit;

@end

Implementación

#import "UIFormView.h"

@implementation UIFormView
{
    UITextField* currentEditingTextField;
}

// Automatically register fields

-(void)addSubview:(UIView *)view
{
    [super addSubview:view];
    if ([view isKindOfClass:[UITextField class]]) {
        if ( ![(UITextField*)view delegate] ) [(UITextField*)view setDelegate:self];
    }
}

// UITextField Protocol

-(void)textFieldDidBeginEditing:(UITextField *)textField
{
    currentEditingTextField = textField;
}

-(void)textFieldDidEndEditing:(UITextField *)textField
{
    currentEditingTextField = NULL;
}

-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    [self endEdit];
}

- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
    if ([self textFieldValueIsValid:textField]) {
        [self endEdit];
        return YES;
    } else {
        return NO;
    }
}

// Own functions

-(void)endEdit
{
    if (currentEditingTextField) {
        [currentEditingTextField endEditing:YES];
        currentEditingTextField = NULL;
    }
}


// Override this in your subclass to handle eventual values that may prevent validation.

-(BOOL)textFieldValueIsValid:(UITextField*)textField
{
    return YES;
}

@end
  • Subclasificando el formulario y anulando el textFieldValueIsValid: método , usted puede evitar el final de la edición si el valor no es correcto para el dado campo.

  • Si un campo tiene un delegado establecido en Interface Builder, el formulario no lo cambia. No veo muchas razones para establecer un delegado diferente para un campo en particular, pero ¿por qué no & # 8230;

Hay muchas maneras de mejorar esta clase de vista de formulario: adjunte un delegado, haga un diseño, maneje cuando el teclado cubra un campo (usando el marco currentEditingTextField), inicie automáticamente la edición para el siguiente campo, ...

Personalmente lo mantengo en mi marco, y siempre lo subclasifico para agregar funciones, a menudo es útil "como está".

Espero que ayude. Saludos a todos

si desea toda la edición en un UIViewController que puede usar.

[[self view]endEditing:YES];

y si desea descartar una ocultación de teclado UITextField pertinente, úsela.

1.agregue delegado en su viewcontroller.h

<UITextFieldDelegate>
  1. hace que la delegación no pueda en su campo de texto.

    self.yourTextField.delegate = self;

  2. agregue este método a su controlador de vista.

    - (BOOL) textFieldShouldEndEditing: (UITextField *) textField { [textField resignFirstResponder]; devuelve SÍ;}

Configure mediante programación el delegado de UITextField en swift 3

Implemente UITextFieldDelegate en su archivo ViewController.Swift (por ejemplo, clase ViewController: UIViewController, UITextFieldDelegate {)

 lazy var firstNameTF: UITextField = {

    let firstname = UITextField()
    firstname.placeholder = "FirstName"
    firstname.frame = CGRect(x:38, y: 100, width: 244, height: 30)
    firstname.textAlignment = .center
    firstname.borderStyle = UITextBorderStyle.roundedRect
    firstname.keyboardType = UIKeyboardType.default
    firstname.delegate = self
    return firstname
}()

lazy var lastNameTF: UITextField = {

    let lastname = UITextField()
    lastname.placeholder = "LastName"
    lastname.frame = CGRect(x:38, y: 150, width: 244, height: 30)
    lastname.textAlignment = .center
    lastname.borderStyle = UITextBorderStyle.roundedRect
    lastname.keyboardType = UIKeyboardType.default
    lastname.delegate = self
    return lastname
}()

lazy var emailIdTF: UITextField = {

    let emailid = UITextField()
    emailid.placeholder = "EmailId"
    emailid.frame = CGRect(x:38, y: 200, width: 244, height: 30)
    emailid.textAlignment = .center
    emailid.borderStyle = UITextBorderStyle.roundedRect
    emailid.keyboardType = UIKeyboardType.default
    emailid.delegate = self
    return emailid
}()

// Marca: - manejo de delegado textField ..

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    view.endEditing(true)
}

func textFieldShouldReturn(_ textField: UITextField) -> Bool {

    if textField == firstNameTF {

        lastNameTF.becomeFirstResponder()
    }

    else if textField == lastNameTF {

        emailIdTF.becomeFirstResponder()
    }
    else {
        view.emailIdTF(true)
    }
    return true
}

Cree una función hidekeyboard y vincúlela al campo de texto en el archivo .xib y seleccione DidEndOnExit

-(IBAction)Hidekeyboard    
{    
      textfield_name.resignFirstResponder;    
}  

Si ha creado la vista usando Interface Builder, use lo siguiente Simplemente cree un método,

-(IBAction)dismissKeyboard:(id)sender
{
[sender resignFirstResponder];
}

Simplemente haga clic con el botón derecho en el campo de texto en la vista, configure el evento como Finalizado al salir y conéctelo al método " desestima Teclado " ;.

La mejor guía para principiantes es       " Desarrollo del primer iPhone y iPad de Head First, segunda edición "

prueba esto

- (BOOL) textView: (UITextView*) textView shouldChangeTextInRange: (NSRange) range replacementText: (NSString*) text
{
    if ([text isEqualToString:@"\n"]) {
        [textView resignFirstResponder];
        return NO;
    }
    return YES;
}
//====================================================
//                  textFieldShouldReturn:
//====================================================
-(BOOL) textFieldShouldReturn:(UITextField*) textField { 
    [textField resignFirstResponder];
    if(textField.returnKeyType != UIReturnKeyDone){
        [[textField.superview viewWithTag: self.nextTextField] becomeFirstResponder];
    }
    return YES;
}

Cualquiera que busque Swift 3

1) Asegúrese de que su Delegado de UITextField esté conectado a su ViewController en el Guión gráfico

2) Implemente UITextFieldDelegate en su archivo ViewController.Swift (por ejemplo, clase ViewController: UIViewController, UITextFieldDelegate {)

3) Use el siguiente método de delegado

func textFieldShouldReturn(textField: UITextField) -> Bool { 
   textField.resignFirstResponder()  
return false }

Así es como descarto el teclado en Swift 4.2 y funciona para mí:

    override func viewDidLoad() {
    super.viewDidLoad()

    let tap = UITapGestureRecognizer(target: self, action: 
    #selector(dismissKeyboard))

    view.addGestureRecognizer(tap)
    }

    @objc func dismissKeyboard (_ sender: UITapGestureRecognizer) {
    numberField.resignFirstResponder()
    }

Swift 3, iOS 9+

@IBAction private func noteFieldDidEndOnExit (_ remitente: UITextField) {} ??

UPD: Todavía funciona bien para mí. Creo que el tipo que dedicó esta respuesta simplemente no entendió que necesita vincular esta acción al UITextField en el guión gráfico.

textField.returnKeyType = UIReturnKeyDone;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top