2011-11-10 8 views
9

J'ai vue avec les notifications de clavier tels que keyboardWillShow et keyboardWillHidekeyboardWillShow appelé deux fois

Tous les codes poignées avec la notification que j'utilise est prise à partir du code exemple d'Apple "KeyboardAccessory"

Quand j'entrer dans ce point de vue, tout fonctionne bien.

Mais quand je reviens à ce point de vue de ses sous-vues, à chaque fois que je tape sur un bouton qui dit:

[myTextField becomeFirstResponder]; 

les méthodes keyboardWillShow et keyboardWillHide seront appelés deux fois à chaque fois.

Il est vraiment déroutant,

Quelqu'un pourrait-il me aide avec cela?

vraiment apprécier!

Répondre

11

Vous pourriez vouloir écrire votre code.

Si vos méthodes sont appelées deux fois, très probablement, vous vous enregistrez plusieurs fois pour les notifications du clavier et vous ne supprimez pas l'observateur lorsque vous le pensez.

Ajoutez votre observateur dans viewWillAppear: et supprimez-le dans viewWillDisappear: et voyez ce qui se passe.

+0

Merci! Je me fais soudain connaître où est le problème! –

+0

Mais que diriez-vous de nous dire la solution à votre problème? On dirait que c'est autre chose que de retirer l'observateur de votre viewcontroller –

+0

Dans mon cas, j'ai effectivement ajouté deux fois l'observateur. Merci ~ – James

6

Il est appelé deux fois sur iOS 8 lorsqu'un clavier personnalisé, tel que SwiftKey, est affiché.

Lors du premier appel, il se prépare probablement à afficher, donc CGSize keyboardSize = [[[notification userInfo] objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size; aura une hauteur de clé de de 0. Le deuxième appel aura la hauteur de clavier correcte, donc si vous devez ajuster les encarts de contenu, vous pouvez vérifier que la hauteur du clavier retourné est> 0 avant de calculer vos encarts.

De plus, il sera appelé chaque fois que l'utilisateur change de clavier.

+3

Je reçois ceci avec exactement la même notification (l'adresse de l'objet est égale) et la hauteur est égale, aussi ... :-(Aussi, j'ajoute seulement l'observateur une fois dans viewDidLoad –

3

Pour moi, changer inputAccessoryView déclencherait un autre appel de keyboardWillShow car la hauteur d'une vue d'accessoire d'entrée affecte la hauteur globale du clavier.