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?
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:
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!
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.
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];
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)
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
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.
Avez-vous pensé à implémenter le protocole UITextFieldDelegate
?
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.
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.
Le moyen le plus simple est:
Accédez à votre constructeur d'interface utilisateur,
sélectionnez UITextField
et "Control-Drag" pour "Detail View Controller-Detail" et relâchez.
La fenêtre va s'ouvrir. Ensuite, sous "Outlets", sélectionnez "Déléguer".
C'est tout. Cela a fonctionné pour moi.
si vous êtes dans UIModalPresentationFormSheet, appelez simplement
- (BOOL)disablesAutomaticKeyboardDismissal
{
return NO;
}
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.
Swift 3.0:
override var disablesAutomaticKeyboardDismissal: Bool {
get{
return false
}
set {
self.disablesAutomaticKeyboardDismissal = false
}
}
Swift 3.0
func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
if textField == addressTextField {
textField.resignFirstResponder()
return false
}
return true
}