2010-06-03 12 views
4

J'ai un UITextView. J'ai mis en place une navigationBar UIBarButtonItem pour répondre à un contact et de démissionner le firstResponder pour mon UITextView. Mais, lorsque la méthode de sélection est appelée, le clavier n'est pas fermé. J'ai vérifié le statut du répondeur UITextView avec isFirstResponder et il renvoie YES. J'ai également vérifié avec canResignFirstResponder et la valeur de retour est NON.Impossible de résilierFirstResponder avec UITextView

Il me manque quelque chose ici ... pourquoi est-ce que ça revient NON?

Je comprends que je peux remplacer canResignFirstResponder en sous-classant UITextView, mais je voudrais éviter cela si possible.

Voici un extrait de code:

- (void) commentCancelButtonTouched:(id)sender 
{ 
    NSLog(@"Cancel button touched"); 
    [self.navigationBar popNavigationItemAnimated: NO]; 

    if ([self.textInput.textView canResignFirstResponder] == NO) { 
     NSLog(@"I don't want to resign!"); 
    } 

    [self.textInput.textView resignFirstResponder]; 
}
+0

Qu'est-ce que la classe 'self.textInput'? – Senseful

+0

C'est une classe personnalisée qui sous-classe 'UIView'. – Calvin

Répondre

1

Je l'ai compris. J'ai eu une méthode 'UITextViewDelegate' dans ma vue 'textInput', textViewShouldEndEditing qui a été substituée pour retourner NO. Changé à YES et il a résolu le problème.

3

répondre à vos UITextField au moyen d'une sous-classe UIView est un peu non standard. Si j'étais vous, je m'occuperais directement de UITextField depuis l'intérieur de votre contrôleur. Configurez-le comme une propriété synthétisée de votre contrôleur de vue, donnez-lui le mot-clé IBOutlet afin de pouvoir en parler dans Interface Builder, puis assurez-vous que la sortie est connectée au champ de texte. En d'autres termes, plutôt que de parler de self.textInput.textView, vous voulez parler directement de self.textView. Et vérifiez votre branchement de sortie IB, car je soupçonne que c'est là que se situe le vrai problème.

+0

Merci pour le conseil, bien que je n'utilise pas Interface Builder pour la vue, c'est fait par programme. – Calvin

+0

Gotcha. Plus encore, avoir une couche d'abstraction entre votre contrôleur et votre UITextField n'est probablement pas une bonne idée. –

+0

Compris. J'avais une méthode 'UITextViewDelegate' dans ma vue' textInput', 'textViewShouldEndEditing' qui était surchargée pour renvoyer NO. Changé à OUI et il a résolu le problème. Gah! Mais encore, merci pour le conseil. – Calvin

5

Juste au cas où quelqu'un veut cacher le clavier lorsque vous touchez à l'extérieur de la textview, il est assez facile ...

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    [super touchesBegan:touches withEvent:event]; 

    [self.xFront resignFirstResponder]; 
} 

xFront est mon exutoire à mon UITextView.