2009-10-22 7 views
14

J'essaie d'utiliser un clavier personnalisé dans mon application, mais je rencontre des problèmes en essayant de le restreindre à un UITextField particulier. J'ai basé mon code sur this Xcode project (initialement trouvé sur this blog). Ce code ajoute un UIButton personnalisé (représentant un «point décimal») dans la vue du clavier UIKeyboardTypeNumberPad. Il le fait en s'abonnant à UIKeyboardWillShowNotification et en modifiant le clavier quand il apparaît. Ce projet Xcode fonctionne très bien, mais lorsque j'ajoute un UITextField supplémentaire, la touche personnalisée est également placée dans le clavier pour ce champ de texte, même si j'ai sélectionné un type de clavier complètement différent pour ce champ de texte.Comment savoir ce que UITextField a causé une UIKeyboardWillShowNotification?

Je tenté d'enregistrer seulement voir les notifications UIKeyboardWillShowNotification de celui particulier UITextField, mais cela ne semble pas fonctionner:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:exampleViewController.textField]; 

J'ai essayé aussi d'inspecter l'objet à l'intérieur du NSNotification passé à keyboardWillShow, mais malheureusement, il se réfère au clavier, pas le contrôle de l'interface utilisateur qui a causé l'apparition du clavier.

2009-10-21 19:50:22.205 Example[6302:207] NSConcreteNotification 0x321ebd0 {name = UIKeyboardWillShowNotification; userInfo = { 
UIKeyboardAnimationCurveUserInfoKey = 0; 
UIKeyboardAnimationDurationUserInfoKey = 0.300000011920929; 
UIKeyboardBoundsUserInfoKey = NSRect: {{0, 0}, {320, 216}}; 
UIKeyboardCenterBeginUserInfoKey = NSPoint: {160, 588}; 
UIKeyboardCenterEndUserInfoKey = NSPoint: {160, 372}; 

}}

Est-ce que je comprends mal l'interface addObserver? Sûrement il doit y avoir un moyen de s'abonner aux notifications d'un contrôle d'interface utilisateur particulier?

Quelqu'un at-il d'autres suggestions sur la façon d'y parvenir?

Répondre

0

Ce projet fonctionne très bien, mais lorsque j'ajoute un UITextField supplémentaire, la clé personnalisée est également placée dans le clavier pour ce champ de texte.

Vous pouvez définir le type de clavier pour une instance UITextField, .: par exemple

[myTextField setKeyboardType:UIKeyboardTypeDefault]; 

ou:

myTextField.keyboardType = UIKeyboardTypeDefault; 

Rechercher l'aide Xcode sur UITextInputTraits Protocol pour une liste des UIKeyboardType constantes.

+0

I spécifiquement mis l'autre UITextField à utiliser différents types de clavier. Malheureusement, le code «clavier personnalisé» modifie tout clavier qui apparaît, et je ne peux pas comprendre comment distinguer quel UITextField a provoqué la notification UIKeyboardWillShowNotification. J'ai mis à jour le post pour clarifier un peu plus. –

-2

J'ai réalisé auparavant en comparant l'objet avec l'objet de l'interface utilisateur que je suis intéressé comme ceci:.

if(notification.object == exampleViewController.textField) 
{ 
    ... 
} 
+7

C'est faux. La documentation indique clairement que l'objet de notification est nul: "UIKeyboardWillShowNotification: Publié immédiatement avant l'affichage du clavier. L'objet de notification est nul." –

21

ne pouvait pas être de ce qui précède pour travailler. A dû le faire manuellement:

if ([companyName isFirstResponder]) { 
    // ............... 
} 
else if ([notes isFirstResponder]) { 
    //............. 
    } 
} 
2

Vous pouvez écrire une méthode de catégorie UIView pour trouver le premier répondeur.

- (UIView *)firstResponder 
{ 
    if ([self isFirstResponder]) 
    { 
     return self; 
    } 

    for (UIView *view in self.subviews) 
    { 
     UIView *firstResponder= [view firstResponder]; 
     if (firstResponder) 
     { 
      return firstResponder; 
     } 
    } 

    return nil; 
} 

Ensuite, dans votre méthode - (void)keyboardWillShow:(NSNotification *)notification vous pouvez l'utiliser comme ceci

UITextField *textField = (UITextField *)[self firstResponder]; 
+0

Cela a fonctionné pour moi. – Stunner

Questions connexes