Remarque:
Voir la réponse acceptée (pas la plus votée) pour la solution à partir d'iOS 4.3.
Cette question concerne un comportement découvert sur le clavier de l'iPad, où il refuse d'être ignoré s'il est affiché dans une boîte de dialogue modale avec un contrôleur de navigation.
Fondamentalement, si je présente le contrôleur de navigation avec la ligne suivante comme ci-dessous:
navigationController.modalPresentationStyle = UIModalPresentationFormSheet;
Le clavier refuse d'être renvoyé. Si je commente cette ligne, le clavier s'en va bien.
...
J'ai deux textFields, nom d'utilisateur et mot de passe; le nom d'utilisateur a un bouton Suivant et le mot de passe a un bouton Terminé. Le clavier ne disparaîtra pas si je le présente dans un contrôleur de navigation modale.
TRAVAUX
broken *b = [[broken alloc] initWithNibName:@"broken" bundle:nil];
[self.view addSubview:b.view];
NE MARCHE PAS
broken *b = [[broken alloc] initWithNibName:@"broken" bundle:nil];
UINavigationController *navigationController =
[[UINavigationController alloc]
initWithRootViewController:b];
navigationController.modalPresentationStyle = UIModalPresentationFormSheet;
navigationController.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
[self presentModalViewController:navigationController animated:YES];
[navigationController release];
[b release];
Si je retire la partie contrôleur de navigation et présente «b» comme contrôleur de vue modale par lui-même, cela fonctionne. Le contrôleur de navigation est-il le problème?
TRAVAUX
broken *b = [[broken alloc] initWithNibName:@"broken" bundle:nil];
b.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
[self presentModalViewController:b animated:YES];
[b release];
TRAVAUX
broken *b = [[broken alloc] initWithNibName:@"broken" bundle:nil];
UINavigationController *navigationController =
[[UINavigationController alloc]
initWithRootViewController:b];
[self presentModalViewController:navigationController animated:YES];
[navigationController release];
[b release];
UINavigationController
classe. À votre santé.resignFirstResponder
que le clavier était en cours d'exécution, mais le clavier était toujours affiché. Mon scénario (presentationFormSheet avec navig contrllr) est exactement le même que le vôtre. Merci beaucoup!!Réponses:
Dans le contrôleur de vue présenté de manière modale, remplacez simplement
disablesAutomaticKeyboardDismissal
pour retournerNO
:la source
Cela a été classé comme "fonctionne comme prévu" par les ingénieurs d'Apple. J'ai déposé un bug pour cela il y a quelque temps. Leur raisonnement est que l'utilisateur va souvent entrer des données sous une forme modale, il essaie donc d'être "utile" et de garder le clavier visible là où d'ordinaire diverses transitions dans la vue modale peuvent provoquer l'affichage / le masquage répétitif du clavier.
edit: voici la réponse d'un ingénieur Apple sur les forums développeurs:
Cela pose beaucoup de problèmes aux gens (moi y compris) mais pour le moment il ne semble pas y avoir de moyen de contourner ce problème.
METTRE À JOUR:
Dans iOS 4.3 et versions ultérieures, vous pouvez désormais implémenter `-disablesAutomaticKeyboardDismissal 'sur votre contrôleur de vue pour retourner NON:
Cela résout le problème.
la source
UINavigationController
sous-classe qui remplacedisablesAutomaticKeyboardDismissal
pour revenirNO
et l'utiliser comme contrôleur de navigation lorsque vous présentez une feuille de formulaire modale. Voir la réponse de @ miha-hribar ci-dessous.Soyez prudent si vous affichez le modal avec un
UINavigationController
. Vous devez ensuite définir ledisablesAutomaticKeyboardDismissal
sur le contrôleur de navigation et non sur le contrôleur de vue. Vous pouvez facilement le faire avec des catégories.Fichier: UINavigationController + KeyboardDismiss.h
Fichier: UINavigationController + KeyboardDismiss.m
N'oubliez pas d'importer la catégorie dans le fichier où vous utilisez le UINavigationController.
la source
disablesAutomaticKeyboardDismissal
deUINavigationController
, et non le contrôleur propre point de vue, pour résoudre ce problème.J'ai résolu ce problème en utilisant le
UIModalPresentationPageSheet
style de présentation et en le redimensionnant immédiatement après l'avoir présenté. Ainsi:la source
Si vous basculez sur un affichage modal différent, vous pouvez faire disparaître le clavier. Ce n'est pas joli et ça n'anime pas, mais vous pouvez le faire disparaître.
Ce serait génial s'il y avait un correctif, mais pour l'instant cela fonctionne. Vous pouvez le caler dans une catégorie
UIViewController
et l'appeler quand vous voulez que le clavier disparaisse:Soyez cependant prudent lorsque vous affichez ViewDidAppear / viewDidDisappear et toutes ces méthodes sont appelées. Comme je l'ai dit, ce n'est pas joli, mais ça marche.
-Adam
la source
Vous pouvez également contourner cela dans une application universelle en vérifiant simplement l'idiome et s'il s'agit d'un iPad, ne faites pas apparaître le clavier automatiquement et laissez l'utilisateur appuyer sur tout ce qu'il souhaite modifier.
Ce n'est peut-être pas la meilleure solution, mais c'est très simple et n'a pas besoin de hacks sophistiqués qui rompront avec la prochaine version majeure d'iOS :)
la source
Mettez ce code dans votre viewWillDisappear: la méthode du contrôleur actuel est une autre façon de résoudre ce problème:
la source
J'ai trouvé que l'
disablesAutomaticKeyboardDismissal
ajout d'unedisablesAutomaticKeyboardDismissal
fonction ne fonctionnait pas pour monUITextField
dans une boîte de dialogue modale.Le clavier à l'écran ne disparaîtrait tout simplement pas.
Ma solution était de désactiver tous les contrôles de saisie de texte dans ma boîte de dialogue, puis de réactiver les contrôles pertinents une fraction de seconde plus tard.
Il semble que lorsque iOS voit qu'aucun des
UITextField
contrôles sont activés, il ne se débarrasser du clavier.la source
Je suis sûr que vous avez regardé cela, mais vous êtes sûr que votre classe de contrôleur est correctement connectée en tant que délégué UITextField, non?
la source
peut - être ne retournez pas NON, mais OUI. Cela peut donc disparaître.
Et vous avez également un
textFieldShouldEndEditing
OUI de retour?Et pourquoi tirez-vousdésolé je vois maintenant[nextResponder becomeFirstResponder]
?!Pouvons-nous supposer qu'aucun d'entre eux, par hasard, n'a une
tag
valeur desecondField.tag+1
? Si c'est le cas, vous leur dites de devenir le premier répondant, au lieu de démissionner du premier répondant. Peut-être mettre un peu NSLog () dans cette structure if.la source
NSLog("tf %x / method ...",textField);
dans toutes les fonctions de délégué?Pour ceux qui ont des problèmes avec UINavigationController, voir ma réponse à une question similaire ici: https://stackoverflow.com/a/10507689/321785
Edit: je considère cela comme une amélioration de la solution de Miha Hribar (puisque la décision se déroule là où elle devrait), et contrairement au commentaire de Pascal concernant une catégorie sur UIViewController
la source
peut ne pas être une solution parfaite, mais fonctionne
[self.view endEditing: YES];
d'où que votre bouton ou geste soit implémenté pour présenter le modal
la source
la source