3 votes

Iphone Textview n'invoque pas TouchesBegan

J'ai un champ de texte qui cache le clavier lorsque je touche un autre endroit de l'écran (via ma fonction TouchesBegan et résignation...blah). Mais lorsque je touche un Textview, la fonction TouchesBegan n'est pas invoquée et le clavier ne se cache pas ! Existe-t-il un moyen d'invoquer TouchesBegan afin de cacher le clavier ?

3voto

TooDiesel Points 51

Je suppose que votre UITextView n'est pas éditable car vous ne voulez pas que le clavier apparaisse lorsque vous le touchez, alors assurez-vous que dans les propriétés d'affichage de votre UITextView, l'option "User Interaction Enabled" n'est pas cochée. Vous pouvez également écrire ceci dans votre ViewController comme suit :

textView.userInteractionEnabled = NO;

Cela permettra aux événements de l'utilisateur d'être transmis à la vue principale, et touchesBegan ainsi que les autres méthodes déléguées seront invoquées.

2voto

spstanley Points 599

La meilleure méthode que j'ai vue pour cela est d'ajouter une vue secondaire transparente qui se superpose à la vue du texte et qui traite les TouchesBegan en premier. Vous pouvez alors détecter les touches en dehors du champ de texte et ignorer le clavier en faisant en sorte que le champ de texte soit le premier à réagir.

Par exemple, créez la sous-vue superposée dans IB ou par programmation, selon le cas. Placez-la et dimensionnez-la de manière à ce qu'elle couvre la ou les vues de texte, et donnez-lui une couleur claire. Si vous ajoutez la vue par l'intermédiaire de l'interface graphique, cachez-la au chargement de la vue principale afin qu'elle n'absorbe pas encore les touches, comme suit :

- (void)viewDidLoad
{
    [super viewDidLoad];
    overView.hidden = YES;
}

Puis, lorsque le champ de texte commence à être édité, désactivez l'affichage :

- (void)textFieldDidBeginEditing:(UITextField *)textField
{
    overView.hidden = NO;
}

Lorsque l'édition du champ de texte est terminée, masquer à nouveau la vue :

- (void)textFieldDidEndEditing:(UITextField *)textField
{
    overView.hidden = YES;
}

Ajoutez un touchesBegan pour détecter quand votre overView non cachée est touchée :

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch *touch = [touches anyObject];

    // Resign first responder if touch is outside text field
    if ([touch view] != myTextField)
        [myTextField resignFirstResponder];

    // Send touches up the responder chain (pass them through)
    [self.nextResponder touchesBegan:touches withEvent:event];
}

Vous pouvez également utiliser des gestes personnalisés, mais cela ne fonctionne qu'avec iOS 4.x et, à mon avis, c'est plus compliqué.

2voto

Amitesh Kumar Points 46

Il existe également un moyen simple de masquer le clavier sur les touchesBegan : lorsque vous utilisez UITextView pour saisir les données.

Étape 1. Assurez-vous d'avoir étendu Textviewdelegate lors de la déclaration de la classe.

@interface YourClassName : UIViewController { IBOutlet UITextView *txtMyView ; }

étape 2 : définir le délégué à soi-même dans la fonction view did load.

- (void)viewDidLoad
{
    txtMyView.delegate = self;
}

étape 3. écrire le code similaire dans la fonction touchesbegan avec le nom de votre textView.

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

}

Merci et salutations.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X