Descartar el keyboard: múltiples UITextFields en iOS 7

A continuación encontrará mis files .h y .m para mi viewcontroller primario.

Tengo 3 preguntas

1.) Debido a que tengo varios campos uitext, ¿tengo que configurar cada uno con su propia statement resignFirstResponder? y 2.) ¿Dónde haría eso, en qué método? 3.) ¿Mi syntax es correcta para renunciar al primer respondedor?

También sería muy bueno si pudiera descartar el keyboard cuando el usuario hace clic fuera del campo ¡NO presionando la tecla de retorno!

Sé que esto se ha preguntado y contestado antes, pero para ser honesto con usted, todavía estoy un poco confundido en cuanto a dónde va.

Estoy usando storyboards, con XCode 5 y iOS 7.

=============================

file .h

@interface ViewController : UIViewController <UITextFieldDelegate,UITableViewDelegate,UITableViewDataSource> @property (weak, nonatomic) IBOutlet UITextField *danceDate; @property (weak, nonatomic) IBOutlet UITextField *dancePlace; @property (weak, nonatomic) IBOutlet UITextField *danceTerminal; @property (weak, nonatomic) IBOutlet UITextField *danceGate; 

file .m

 #import "ViewController.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; [self retrieveFromParse]; self.tableView.dataSource = self; self.tableView.delegate = self; self.navigationItem.rightBarButtonItem = self.editButtonItem; // SET DELEGATE HERE // // if I uncomment 1 of these lines, i'll get an error. // // _dancePlace.delegate = self; // dancePlace.delegate = self; // dancePlace = self; } - (void)textFieldDidBeginEditing:(UITextField *)textField { } -(BOOL) textFieldShouldReturn: (UITextField *) textField { [textField resignFirstResponder]; return YES; } -(BOOL) textFieldShouldReturn: (UITextField *) textField { return YES; } 

Renunciando el campo de text: Todo su textField.delegate debe establecerse como el object ViewController. Y luego implementa el siguiente método de delegado.

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

Para descartar el Teclado de la vista: Agregue un gesto de Tap a su ViewController.view de la siguiente manera:

 //declare a property to store your current responder @property (nonatomic, assign) id currentResponder; //in viewDidLoad: UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(resignOnTap:)]; [singleTap setNumberOfTapsRequinetworking:1]; [singleTap setNumberOfTouchesRequinetworking:1]; [self.view addGestureRecognizer:singleTap]; [singleTap release]; //Implement the below delegate method: - (void)textFieldDidBeginEditing:(UITextField *)textField { self.currentResponder = textField; } //Implement resignOnTap: - (void)resignOnTap:(id)iSender { [self.currentResponder resignFirstResponder]; } // was missing ; after the call --> [self.currentResponder resignFirstResponder] // also in textFieldDidEndEditing set self.currentResponder = nil; 

Prueba lo siguiente:

 [[self view] endEditing:YES] 
  -(BOOL) textFieldShouldReturn: (UITextField *) textField{ [textField resignFirstResponder]; return YES; } 

también conecte su delegado UITextField .

Esta respuesta funciona para iOS 7 y arco,

  1. descarte el keyboard cuando el usuario toca el retorno: en ViewController agrega la siguiente acción

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

a continuación, en main.storyboard, select textField y, desde el control del inspector de conexiones, arrastre el evento "Did End On Exit" al controller de vista.

  1. descarte el keyboard cuando el usuario toca background: implementa el siguiente método en ViewController

      - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { UITouch *touch = [[event allTouches] anyObject]; if ([YOUR_TEXT_FIELD isFirstResponder] && [touch view] != YOUR_TEXT_FIELD) { [YOUR_TEXT_FIELD resignFirstResponder]; } [super touchesBegan:touches withEvent:event]; } 

Esto es lo que uso en mi código. Funciona muy bien y es más eficiente que las otras respuestas.

En yourviewcontroller.h agregue:

@property (nonatomic) UITapGestureRecognizer *tapRecognizer;

Ahora en el file .m, agregue esto a su function ViewDidLoad:

 - (void)viewDidLoad { //Keyboard stuff tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(didTapAnywhere:)]; tapRecognizer.cancelsTouchesInView = NO; [self.view addGestureRecognizer:tapRecognizer]; } 

Además, agregue esta function en el file .m:

 - (void)handleSingleTap:(UITapGestureRecognizer *) sender { [self.view endEditing:YES]; } 

Cuando UITextField en cuestión llama al método de delegado de - (BOOL)textFieldShouldReturn:(UITextField*)textField se pasa a ser el argumento.

Por lo tanto, el textField específico disponible como argumento para este método ES el específico que le interesa. Dentro de este método de delegado, puede simplemente referirse a él como "campo de text".

Eso significa que debe usar lo que Mirko Catalano le aconsejó llamar resignFirstResponder en textField lugar de en las properties individuales como lo estaba haciendo.

La sugerencia de Mirko para verificar que el delegado esté efectivamente asignado también es crítica. Deberá asegurarse de que TODOS sus UITextFields en la plumilla o guión gráfico tengan su propiedad de delegado apuntando al propietario del file. ¡De lo contrario, el post de delegado no irá a ninguna parte y será ignorado prontamente!

Intente usar self.dancePlace.delegate = self; en lugar de dancePlace.delegate = self; para configurar UITextFieldDelegate. ¿Eso funciona?

En veloz 3:

  //Dismiss keyboard , When touch outside override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { self.view.endEditing(true) }