web-dev-qa-db-fra.com

resignFirstResponder ne cache pas le clavier sur textFieldShouldReturn

J'ai une vue avec un UITextField qui devrait masquer le clavier lorsque le retour est enfoncé.

Ma fonction est la suivante:

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

Normalement, le clavier doit être masqué mais il reste à l'écran. resignFirstResponder est appelé correctement. Qu'est-ce que je rate?

29
favo

Je vois que vous avez la balise iPad à ce sujet. Présentez-vous une vue modale à l'aide de UIModalPresentationFormSheet? Si tel est le cas, il semble que ceci soit une limitation de la présentation modale de FormSheet (Apple le fait intentionnellement pour une raison quelconque ou il s'agit d'un bogue). Voir ces autres questions pour plus de détails:

La boîte de dialogue modale n'abandonne pas le clavier

Modal View Controller avec clavier sur iPad en mode paysage change d'emplacement en cas de licenciement

49
Brandon

Il existe une méthode utile qui vous permet d’écarter le clavier lorsque vous présentez la boîte de dialogue Modal:

 - (BOOL)disablesAutomaticKeyboardDismissal { return NO; }

Cela remplacera le comportement par défaut de la boîte de dialogue modale définie par Apple et vous permettra de fermer le clavier. C'est dans la classe UIViewController.

J'espère que ça aidera quelqu'un!

33
tony.stack

Si vous utilisez Interface Builder, vérifiez si votre UITextField a le lien délégué associé à votre classe. 

-Sélectionnez votre UITextField et dans vos connexions, regardez s'il existe une connexion dans Outlets-> délégué. Sinon, connectez-vous avec votre classe de propriétaire de fichier.

Cela doit être lié à la classe de propriétaire de votre fichier. Ce délégué indique où rechercher une méthode. Si vous substituez une méthode, vous devez indiquer où l'objet le cherchera.

10
Marcos Issler

Cette solution a fonctionné pour moi après aucune de ces solutions. après avoir appelé resignFirstResponder, j’ai ajouté une vue modale et l’a supprimée.



    [myTextField resignFirstResponder];
    UIViewController *dummyController = [[UIViewController alloc] init];
    UIView *dummy = [[UIView alloc] initWithFrame:CGRectMake(-1, -1,1,1)];
    [dummyController setView:dummy];
    [self presentModalViewController:dummyController animated:NO];
    [dummyController dismissModalViewControllerAnimated:NO];

7
gmeroz

Pour traiter le bogue mentionné par Brandon, vous pouvez essayer de fermer et de rouvrir votre contrôleur de vue modale tant que vous en avez encore la référence.

[textField resignFirstResponder];
[self dismissModalViewControllerAnimated:NO];
[self presentModalViewController:yourModalViewControllerReference animated:NO];

(où "self" devrait être le contrôleur que vous avez utilisé pour ouvrir à l'origine le contrôleur de vue modal)

4
drynaski

xcode 4.5.1  

Il suffit de cliquer sur control puis sur le champ de texte, puis glissez et relâchez le fichier .h  

( touche de contrôle + glisser )

puis dans le menu contextuel, sélectionnez

connection=acton;
name= any name;
type=id;
event=did end on exit;
arguments=sender;

puis cliquez sur le bouton de connexion

3
madusanka

J'avais le même problème. J'ai réalisé qu'après avoir connecté le délégué au propriétaire du fichier dans Interface Builder, j'avais négligé d'enregistrer dans Interface Builder. Une fois que j'ai sauvegardé, j'ai recompilé et le clavier disparaît correctement lorsque vous appuyez sur retour.

3
jmundie

Avez-vous pensé à implémenter le protocole UITextFieldDelegate?

2
WrightsCS

J'ai lu de nombreux articles sur ce problème, où le clavier à l'écran refuse de se cacher lorsque vous appelez resignFirstResponder, mais aucune des suggestions proposées n'a fonctionné pour moi.

J'utilise XCode 5 (iOS 7) et mon écran d'iPhone contient quelques commandes qui nécessitent le clavier à l'écran. Si l'utilisateur clique sur la variable UIButton, je souhaite que le clavier disparaisse.

enter image description here

J'ai probablement perdu une journée complète à expérimenter avec resignFirstResponder et à ajouter des fonctions disablesAutomaticKeyboardDismissal pour renvoyer NO, mais rien n'a fonctionné. Une fois que le clavier à l'écran est apparu, je n'ai jamais pu le faire disparaître à nouveau.

Mais ensuite, j'ai eu une petite onde cérébrale (car je n'ai qu'un petit cerveau).

Maintenant, lorsque l’utilisateur clique sur ma UIButton, j’ai simplement désactive les contrôles UITextField et UITextView.

- (IBAction)btnDate_Tapped:(id)sender {
    //  The user has clicked on the "Date" button.
    self.tbClientName.enabled = NO;
    self.tbComments.editable = NO;

Et tout à coup, l’application s’aperçoit qu’elle ne dispose pas de champs de texte modifiables nécessitant un clavier à l’écran et glisse soigneusement le clavier hors de vue.

(Soupir soulagé.)

Ma UIButton fait apparaître une boîte de dialogue contextuelle. Lorsque l'utilisateur ferme la fenêtre contextuelle, je réactive ces deux commandes. Ainsi, si l'utilisateur appuie sur l'une d'entre elles, le clavier réapparaîtra.

-(void)popoverControllerDidDismissPopover:(UIPopoverController *) popoverController {
    //  The user has closed our popup dialog.
    //  We need to make our UITextField and UITextView editable again.
    self.tbClientName.enabled = YES;
    self.tbComments.editable = YES;
    ... etc...
}

Simple, n'est-ce pas!

Et étonnamment, cette solution de contournement fonctionne même sur UIViewControllers qui apparaissent dans Modal style.

J'espère que cela aidera d'autres victimes de XCode. 

1
Mike Gledhill

Le moyen le plus simple est: 

  1. Accédez à votre constructeur d'interface utilisateur, 

  2. sélectionnez UITextField et "Control-Drag" pour "Detail View Controller-Detail" et relâchez. 

  3. La fenêtre va s'ouvrir. Ensuite, sous "Outlets", sélectionnez "Déléguer". 

C'est tout. Cela a fonctionné pour moi.

0
Timur Nurullaev

si vous êtes dans UIModalPresentationFormSheet, appelez simplement 

- (BOOL)disablesAutomaticKeyboardDismissal
{
    return NO;
}
0
Jeremy Piednoel

En vous basant sur votre commentaire selon lequel il semble que la focalisation ait changé, je pense que ce qui pourrait arriver, c’est que le clavier reste ouvert pour le champ de saisie de texte suivant. Si votre touche de retour est une touche "Suivant", renvoyer YES pour textFieldShouldReturn: fera du prochain textField le premier répondeur et maintiendra le clavier visible.

0
Chris Garrett

Swift 3.0:

override var disablesAutomaticKeyboardDismissal: Bool {
    get{
        return false
    }
    set {
        self.disablesAutomaticKeyboardDismissal = false
    }
}
0
Josh O'Connor

Swift 3.0

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

    if textField == addressTextField {
        textField.resignFirstResponder()

        return false
    }

    return true
}
0
krish