Clavier apparaît après UIAlertView est rejeté sur iOS 8.3 pour iPad
Avec le dernier iOS 8.3 sortie, notre application commence à avoir un comportement bizarre.
Après la fin de textfield d'édition, l'utilisateur peut cliquer sur le bouton de fermeture qui amène une UIAlertView
. Lorsque l'utilisateur clique sur jeter dans le alertview, alertview et affichage en cours sont rejetées. Mais de toute façon, le clavier s'affiche après le point de vue est allé qui est assez ennuyeux pour les utilisateurs.
Après un peu de débogage, il semble que le clavier est affiché pour la dernière textfield que l'utilisateur a accédé avant la fermeture de la vue. J'ai essayé plusieurs façons de endEditing
pour la vue en cours dans de nombreux endroits (avant de montrer UIAlertView
, après avoir cliqué sur un bouton dans la UIAlertView
; j'ai même mis le focus à un autre élément de l'INTERFACE utilisateur de la vue). Elle ne résout pas le problème.
Mais pour ce problème particulier, je ne suis pas sûr si c'est un problème commun ou quelque chose que nous devons corriger. Tout fonctionne parfaitement avant d'iOS 8.3.
Nous comprenons que UIAlertView
est déconseillé pour iOS 8. Nous avons commencé à migrer vers UIAlertController
. Mais s'il existe une solution de contournement, nous aimerions entendre parler.
Voici un extrait de code.
- (IBAction)closeTapped:(UIButton *)sender
{
//try to resign first responder
//[self.tfName resignFirstResponder];
//[self.tfPosition resignFirstResponder];
[self.view endEditing:YES];
if(self.orderDetails.isOpen && self.orderItemChanged)
{
UIAlertView* saveAlert = [[UIAlertView alloc] initWithTitle:@"Unsaved Changes"
message:@"Your changes have not been saved. Discard changes?"
delegate:self
cancelButtonTitle:@"Cancel"
otherButtonTitles:@"Save", @"Discard", nil];
[saveAlert show];
}
else
{
[self close];
}
}
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
switch(buttonIndex)
{
case 1: //Save
{
[self save];
break;
}
case 2: //Discard
{
[self close];
break;
}
}
}
- (void)close
{
[self.delegate dismissEditOrderItemVC];
}
- Avez-vous essayer d'appeler resignFirstResponder sur le champ de texte avant de montrer l'affichage des alertes?
- Oui, je n'ai resignFirstResponder pour tous les objets textfield et endEditing pour l'affichage en cours. Ne semble pas fonctionner 🙁
- Vous pourriez avoir à nous montrer le code pour être en mesure d'aider les autres. Il semble que le licenciement d'alerte vue est le déclenchement de certains du cycle de vie des appels sur votre vue-contrôleur.
- J'ai ajouté un extrait de code pour post original. Merci.
- Faites-vous quelque chose dans viewWillAppear / viewDidAppear?
- Rien. Seulement dans le viewDidLoad pour configurer l'affichage de la structure.
- double possible de Clavier perd cacher capacité "si j'utilise un UIAlertView"
Vous devez vous connecter pour publier un commentaire.
Si votre cible de déploiement est iOS 8+, essayez
UIAlertController
.Voici une solution rapide pour
UIAlertView
: retarder l'invocation de montrer l'affichage des alertes lorsque votre champ de texte ou l'affichage du texte de la démission du premier intervenant.Si quelqu'un est en lutte avec ce, j'espère que cela aidera:
UIAlertController
est disponible. Vous devez utiliserif (NSClassFromString(@"UIAlertController")) {
à la place qui revientnil
si la classe n'existe pas. À l'aide de la ci-dessus entraînera dans votre application crash sur iOS 7.1 ou une version antérieure.vous avez besoin de changer d'alerte pour ios 8.3
la première à mettre dans votre vue
puis
cela vous aidera comme il m'aide dans même problème.
le code ci-dessus est compatible avec ios 7 & 8
respondsToSelector:
vérifier plutôt que d'utiliser l'iOS numéro de version: stackoverflow.com/questions/25111011/...action
etalertController
. Ne me demandez pas pourquoi s'en rendre compte ....J'ai un clavier popping up (avec le curseur dans la dernière utilisée textView) après la fermeture d'un UIAlertController et voici un très simple correctif:
Immédiatement avant de construire et de présenter les UIAlertController,
À l'aide de [_activeTextView resignFirstResponder], le clavier va réapparaître.
À l'aide de [soi.vue endEditing:OUI], le clavier ne réapparaîtra PAS.
J'espère que cela vous aide.
Essayez d'utiliser le code ci-dessous. Il fonctionne très bien pour iOS 8 et en dessous de la version
}
Si un champ de texte est le premier intervenant, il s'ouvre automatiquement le clavier lorsque l'alerte est rejeté. S'assurer que le premier intervenant est correctement licencié avec:
Rappelez-vous: dans une table ou faire défiler la vue, parfois, le terrain doit être visible sur l'écran pour bien rejeter le répondeur.
Si il n'y a pas de secouristes actifs, le clavier ne doit pas apparaître lorsque l'alerte est rejeté.
Pour le cas particulier de cette question, je voudrais vous recommandons de définir une méthode du délégué à écouter le bouton "terminé" et démissionner le premier intervenant dans le délégué de rappel.
Par ailleurs, lorsque le début de l'édition, vous pouvez stocker une référence pour le champ de texte, puis dans votre "clickedButtonAtIndex" méthode, vous pouvez démissionner de l'actif champ de texte si elle est toujours active.
J'ai remarqué un comportement bizarre avec textField claviers et alertViews ainsi... Peut-être faire un bool appelé disableKeyboard et de l'utiliser comme ceci:
C'est juste une solution de contournement et n'aborde pas la question centrale, quel qu'il soit. Pour que cette méthode fonctionne, vous devez définir la alertView et textField délégué méthodes dans votre en-tête.