2009-07-10 4 views
3

J'utilise la méthode décrite par Josh dans this question pour ajouter une barre d'outils en haut du clavier de l'iPhone. Au fond, l'idée est:La barre d'outils alignée au clavier de l'iPhone reste-t-elle visible lors du changement du premier répondant?

  • Ajouter le contrôleur de vue à titre d'observateur pour les notifications UIKeyboardWillShowNotification et UIKeyboardWillHideNotification dans sa méthode d'initialisation
  • Chaque fois que ces notifications sont affichées, animer une barre d'outils sur/hors de l'écran ainsi que le clavier

J'ai aussi plusieurs UITextFields sur l'écran, tous qui deviennent le premier intervenant lors de la sélection pour l'édition et la démission premier intervenant lors de l'édition est terminée (soit l'utilisateur tape un autre champ de texte, hors tout champ de texte, ou appuie sur "Terminé" sur le clavier - j'ai textFieldShouldReturn: remplacée par resignFirstResponder).

J'ai un problème, cependant, puisque les notifications sont affichées chaque fois que je passe d'un champ de texte à l'autre. Par exemple, si un utilisateur est en train d'éditer le champ de texte A, il finit avec et tape sur le champ de texte B, A abandonne le premier répondeur et B devient le premier répondeur. Cependant, cela affiche aussi les notifications "will show" et "hide" sur mon contrôleur de vue. Le résultat final de tout cela est que lorsque la barre d'outils apparaît avec le clavier pour le premier champ de texte, et disparaît avec le clavier pour le dernier champ de texte, il semble glisser dans et hors du clavier chaque fois que le l'utilisateur bascule entre les champs de texte.

Existe-t-il un moyen de ne répondre aux notifications "will {show, hide}" que si le clavier est en fait va afficher ou masquer? En d'autres termes, comment puis-je ignorer les notifications qui n'entraîneront pas de modification de l'état visible du clavier?

Répondre

4

Vous devez créer un BOOL ivar pour savoir si le clavier est déjà visible ou non. Vous utiliserez donc toutes les méthodes de délégué UITextField :) Les barres d'outils avec plusieurs champs de texte peuvent être difficiles, mais tu es très proche!

+0

j'espérais qu'il ne serait pas venu à cette :) Merci! – Tim

+0

Oui, c'est une douleur. Un de ces jours, ils nous donneront une barre d'outils sur le clavier, et nous arrêterons de le pirater pour le faire fonctionner. –

4

Pour faire suite à la réponse de Reed: J'ai fini par utiliser l'implémentation suivante. Il utilise un BOOL pour savoir si le contrôleur se trouve entre un message textFieldShouldBeginEditing: et textFieldDidBeginEditing:, ainsi qu'un ivar pour suivre le champ de texte en cours d'édition.

La mise en œuvre suppose que l'interface présente les propriétés appropriées et les marqueurs @synthesize. MyKeyboardToolbar est une sous-classe de UIToolbar avec un initialiseur personnalisé pour créer ses propres boutons.

BOOL shouldBeginEditing; 
UITextField *editingField; 
MyKeyboardToolbar *keyboardBar;

Et le code lui-même:

- (BOOL)textFieldShouldReturn:(UITextField *)textField { 
    // Give up first responder so the keyboard goes away 
    [textField resignFirstResponder]; 

    return YES; 
} 

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField { 
    self.shouldBeginEditing = YES; 
    return YES; 
} 

- (void)textFieldDidBeginEditing:(UITextField *)textField { 
    self.shouldBeginEditing = NO; 
    self.editingField = textField; 
} 

- (BOOL)textFieldShouldEndEditing:(UITextField *)textField { 
    // Do things here with the edited data (e.g. save it somewhere) 

    return YES; 
} 

- (void)textFieldDidEndEditing:(UITextField *)textField { 
    self.editingField = nil; 
} 

// These methods are added as the observers to the notification center 
- (void)keyboardWillShow:(NSNotification *)notification { 
    if(self.keyboardBar == nil) { 
     // Create and show the keyboard toolbar 
    } 
} 

- (void)keyboardWillHide:(NSNotification *)notification { 
    if(![self shouldBeginEditing]) { 
     // Animate the bar off the screen, if necessary 

     // Remove and dispense of the bar entirely 
     [self.keyboardBar removeFromSuperview]; 
     self.keyboardBar = nil; 
    } 
} 

// This method's selector is given to the keyboard toolbar's Done button 
- (void)didPressKeyboardBarDoneButton { 
    [self.editingField resignFirstResponder]; 
}
+0

Merci beaucoup d'avoir posté ce suivi. C'était très utile car j'étais dans une situation similaire. – Luke

Questions connexes