clavier iPad ne fermeront pas si modal ViewController style de présentation est UIModalPresentationFormSheet
Remarque:
Voir accepté de répondre (pas top voté un) pour la solution de l'iOS 4.3.
Ce question est à propos d'un comportement découvert dans l'iPad clavier, où il refuse d'être rejetée si elle est affichée dans une boîte de dialogue modale avec une manette de navigation.
En gros, si je présente la manette de navigation avec la ligne suivante comme ci-dessous:
navigationController.modalPresentationStyle = UIModalPresentationFormSheet;
Le clavier refuse d'être rejeté. Si je commente cette ligne, le clavier va bien.
...
J'en ai deux textFields, le nom d'utilisateur et mot de passe, nom d'utilisateur a un bouton "Suivant" et le mot de passe a un bouton Terminé. Le clavier ne va pas loin si je le présente dans une modal manette de navigation.
ŒUVRES
broken *b = [[broken alloc] initWithNibName:@"broken" bundle:nil];
[self.view addSubview:b.view];
NE FONCTIONNE 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 débranche la manette de navigation de la partie et de présenter des " b " comme un modal-vue-contrôleur par lui-même, il fonctionne. Est la manette de navigation le problème?
ŒUVRES
broken *b = [[broken alloc] initWithNibName:@"broken" bundle:nil];
b.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
[self presentModalViewController:b animated:YES];
[b release];
ŒUVRES
broken *b = [[broken alloc] initWithNibName:@"broken" bundle:nil];
UINavigationController *navigationController =
[[UINavigationController alloc]
initWithRootViewController:b];
[self presentModalViewController:navigationController animated:YES];
[navigationController release];
[b release];
- La suite DONC, la question semble avoir le même problème, mais il n'y a pas de réponses: stackoverflow.com/questions/3019709/...
- +1 Merci pour votre explication. Mais où dois-je mettre cette méthode? Il ne semble pas travailler où je créer le code pour la présentation d'un modèle de contrôleur...
- Il doit être dans le modèle-vue-contrôleur de classe elle-même.
- Merci. Je vois. J'ai résolu de le mettre dans une catégorie pour
UINavigationController
classe. Des acclamations. - Je suis tellement reconnaissant à vous pour cette question. J'ai été surpris de voir que
resignFirstResponder
était en cours d'exécution, mais le clavier toujours montré. Mon scénario (presentationFormSheet avec navig contrllr) est exactement la même que la vôtre. Merci une tonne!!
Vous devez vous connecter pour publier un commentaire.
Dans la vue contrôleur qui est présenté sous forme modale, de substituer
disablesAutomaticKeyboardDismissal
de retourNO
:Cela a été classé comme "fonctionne comme prévu" par les ingénieurs d'Apple. J'ai déposé un bug pour cela un moment de retour. Leur raisonnement est que l'utilisateur est souvent va être saisie de données dans un formulaire modal alors ils sont en train d'être "utile" et de garder le clavier visible où d'ordinaire les différentes transitions à l'intérieur de la modale de la vue peut provoquer le clavier pour afficher/masquer à plusieurs reprises.
edit: voici la réponse d'une Pomme ingénieur sur les forums des développeurs:
C'est de donner beaucoup de les problèmes de quelqu'un (moi y compris), mais pour le moment il ne semble pas être un moyen de le contourner.
Mise à JOUR:
Dans iOS 4.3 ou version ultérieure, vous pouvez maintenant mettre en œuvre `-disablesAutomaticKeyboardDismissal " sur votre point de vue contrôleur pour revenir NO:
Cela résout le problème.
UINavigationController
sous-classe qui remplacedisablesAutomaticKeyboardDismissal
de retourNO
et ce que la manette de navigation lorsque vous présentez un formulaire modal de la feuille. Voir la réponse de @miha-hribar ci-dessous.Être prudent si vous êtes en affichage modal avec un
UINavigationController
. Ensuite, vous devez définir ladisablesAutomaticKeyboardDismissal
sur la manette de navigation et non sur la vue du contrôleur. Vous pouvez facilement le faire avec des catégories.Fichier: UINavigationController+KeyboardDismiss.h
Fichier: UINavigationController+KeyboardDismiss.m
Ne pas oublier d'importer de la catégorie dans le fichier où vous utilisez le
UINavigationController.
disablesAutomaticKeyboardDismissal
deUINavigationController
, pas le propre point de vue contrôleur, pour résoudre ce problème.J'ai résolu ce problème en utilisant le
UIModalPresentationPageSheet
style de présentation et de redimensionnement immédiatement après que je la présente. Comme:Si vous activez un autre modale de l'affichage vous pouvez obtenir le clavier à disparaître. Ce n'est pas assez et il n'a pas d'animer le bas, mais vous pouvez l'obtenir pour aller loin.
Ce serait formidable s'il y avait une solution, mais pour l'instant cela fonctionne. Vous pouvez le coincer dans une catégorie sur
UIViewController
et de l'appeler quand vous voulez que le clavier disparu:Être prudent avec ce même si, comme vous viewDidAppear /viewDidDisappear et toutes ces méthodes appelées. Comme je l'ai dit, c'est pas joli, mais ne fonctionne pas.
-Adam
Vous pouvez également contourner ce problème dans une application universelle, par une simple vérification de l'idiome et si c'est un iPad, ne pas afficher le clavier automatiquement et de laisser à l'utilisateur d'appuyer ce qu'ils veulent modifier.
Peut ne pas être la meilleure solution, mais c'est très simple et ne nécessite pas de fantaisie hacks qui va rompre avec la prochaine version d'iOS 🙂
Pour les personnes ayant des problèmes avec l'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 Miha Hribar de la solution (puisque la décision est prise de l'endroit où il devrait), et contrairement à Pascal commentaire concernant une catégorie sur UIViewController
Mettez ce code dans votre viewWillDisappear: la méthode de la boucle de courant est une autre façon de résoudre ce problème:
Je suis sûr que vous avez regardé ça, mais vous êtes sûr que votre classe de contrôleur est correctement branché comme l'objet UITextField délégué, à droite?
peut-être ne reviens pas NON, mais OUI. De sorte qu'il peut aller loin.
Et vous avez un
textFieldShouldEndEditing
retour OUI ainsi?Et pourquoi êtes-vous tirdésolé je vois maintenant[nextResponder becomeFirstResponder]
?!Peut nous supposons aucun d'entre eux, par hasard, a un
tag
valeur desecondField.tag+1
? Si oui, vous êtes en leur disant de devenir intervenant de première ligne, au lieu de donner sa démission, le premier intervenant. Peut-être mettre quelques NSLog() dans ce cas la structure.NSLog("tf %x / method ...",textField);
dans toutes les fonctions de délégué?peut-être pas une solution parfaite ,mais fonctionne
[auto.vue endEditing:YES];
d'où le bouton ou le geste est mis en œuvre pour présenter modal
J'ai trouvé que
disablesAutomaticKeyboardDismissal
et l'ajout d'undisablesAutomaticKeyboardDismissal
fonction n'a pas fonctionné pour monUITextField
dans une boîte de dialogue modale.Le clavier à l'écran n'aurait tout simplement pas s'en aller.
Ma solution a été de désactiver tous les textes-les contrôles d'entrée dans ma boîte de dialogue, puis de le ré-activer les éléments pertinents d'une fraction de seconde plus tard.
Il semble que quand iOS voit qu'aucun des
UITextField
commandes sont activées, puis il ne se débarrasser du clavier.