2010-07-26 5 views
3

J'ai vu des discussions sur la façon de fermer le clavier lorsqu'un UITextField perd le focus, mais cela n'a pas fonctionné pour moi et je ne sais pas comment. Le "touchesBegan: withEvent:" dans le code suivant, ne sera jamais appelé. Pourquoi?Masquage du clavier lorsque UITextField perd le focus

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

    UITouch *touch = [[event allTouches] anyObject]; 
    if ([self.textFieldOnFocus isFirstResponder] && [touch view] != self.textFieldOnFocus) { 
     [textFieldOnFocus resignFirstResponder]; 
    } 
    [super touchesBegan:touches withEvent:event]; 
} 

P.S .: Ce code a été inséré dans le contrôleur de vue qui a un UITableView. UITextField se trouve dans une cellule de cette table. Donc, mon opinion est la suivante: cette méthode n'est pas appelée, parce que le toucher se produit sur l'UITableView de mon ViewController. Donc, je pense, que je devrais avoir à sous-classer UITableView, pour utiliser cette méthode comme je l'ai vu sur d'autres Threads, mais cela peut être plus facile.

Pourriez-vous s'il vous plaît aide-moi? Merci beaucoup!

Répondre

2

Assurez-vous de définir le delegate du UITextField sur First Responder dans IB. Et je viens de mettre une coutume (invisible) UIButton sur l'écran et mettre en place un IBAction pour cacher le clavier. Ex:

- (IBAction)hideKeyboard { 
    [someTextField resignFirstResponder]; 
} 

Cela accroché à un UIButton.

0
-(void)touchesEnded: (NSSet *)touches withEvent: (UIEvent *)event 
{ 
    for (UIView* view in self.view.subviews) 
    { 
     if ([view isKindOfClass:[UITextField class]]) 
     [view resignFirstResponder]; 
    } 
} 
2

Voici ma solution, un peu inspiré par plusieurs postes de SO: gérer simplement le geste du robinet dans le contexte de la vue, l'utilisateur est « évidemment » en essayant de quitter le centre de la UITextField.

-(void)handleViewTapGesture:(UITapGestureRecognizer *)gesture 
{ 
    [self endEditing:YES]; 
} 

Ceci est implémenté dans ViewController. Le gestionnaire est ajouté en tant que geste de reconnaissance à la vue appropriée dans la vue setter de la propriété:

-(void) setLoginView:(LoginView *)loginView 
{ 
    _loginView = loginView; 

    UITapGestureRecognizer *tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self.loginView action:@selector(handleTapGesture:)];  

    [tapRecognizer setDelegate:self]; // self implements the UIGestureRecognizerDelegate protocol 

    [self.loginView addGestureRecognizer:tapRecognizer];  
} 

Le gestionnaire peut être défini dans la vue aussi bien. Si vous n'êtes pas familier avec les gestes de manipulation, voir les docs d'Apple sont des tonnes d'échantillons ailleurs.

Je dois mentionner que vous aurez besoin d'un code supplémentaire pour assurer que d'autres contrôles aux robinets, vous avez besoin d'un délégué qui implémente le protocole UIGestureRecognizerDelegate et cette méthode:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch 
{  
    if ([touch.view isKindOfClass:[UIButton class]]) // Customize appropriately. 
     return NO; // Don't let the custom gestureRecognizer handle the touch 

    return YES; 
} 
Questions connexes