45 votes

Masquer le clavier en cas de perte du focus sur une UITextView

J'ai donc une UITextView que j'utilise pour permettre à l'utilisateur de soumettre du texte.

Mon problème est, je n'arrive pas à comprendre comment permettre à l'utilisateur d'annuler en appuyant sur UITextView.

107voto

ohhorob Points 6994

Simplifier la réponse de tuzzolotron : où la prise suivante est correctement connectée dans votre xib

     IBOutlet UITextView *myTextView;
 

Utilisez ceci dans le contrôleur de vue:

 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {

    UITouch *touch = [[event allTouches] anyObject];
    if ([myTextView isFirstResponder] && [touch view] != myTextView) {
        [myTextView resignFirstResponder];
    }
    [super touchesBegan:touches withEvent:event];
}
 

Un tap sur la vue du contrôleur de la vue, en dehors de la vue du texte, va démissionner du premier intervenant, fermant le clavier.

30voto

Sr.Richie Points 3084

Une autre approche que j'ai beaucoup utilisée lorsque je travaille avec UITableViews, la barre de recherche et le clavier est la suivante: je pense que vous pouvez l'appliquer à un champ de texte.

 UITapGestureRecognizer *gestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(hideKeyboard)];
[self.tableView addGestureRecognizer:gestureRecognizer];
gestureRecognizer.cancelsTouchesInView = NO;  // this prevents the gesture recognizers to 'block' touches
[gestureRecognizer release];
 

Et puis, voici la simple fonction de rappel

 - (void)hideKeyboard {
[myTextField resignFirstResponder];
 

}

J'espère que ça aide

7voto

tuzzolotron Points 318

À mon avis:

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

    // pass touches up to viewController
    [self.nextResponder touchesBegan:touches withEvent:event];
}
 

Dans mon contrôleur de vue:

 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {

    UITouch *touch = [[event allTouches] anyObject];
    if (keyboardShown && [touch view] != self.TextView) 
    {
         [self.TextView resignFirstResponder];
    }
    [super touchesBegan:touches withEvent:event];
}

- (void)keyboardWasShown:(NSNotification*)aNotification
{    
        keyboardShown = YES;
}
 

1voto

Yas Kuraishi Points 3210

Voici une meilleure solution qui ne dépend pas d'un point de vente et qui va fonctionner avec un nombre quelconque d'objets UITextField dans votre contrôleur.

 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {

    UITouch *touch = [[event allTouches] anyObject];

    if (![[touch view] isKindOfClass:[UITextField class]]) {
        [self.view endEditing:YES];
    }
    [super touchesBegan:touches withEvent:event];
}
 

0voto

David Jeske Points 346

Je voulais une version de ce logiciel qui résiste à toutes les vues sans nécessiter de sorties spécifiques. Voici ma solution, que je mets dans l'une de mes vues de conteneur standard.

Il utilise MonoTouch C #, mais il devrait être évident de le convertir en Objective-C.

     private void findAndResignFirstResponder(UIView node=null) {
        if (node == null) { return; }
        if (node.IsFirstResponder) {
            node.ResignFirstResponder();
            return;
        }

        foreach (UIView view in node.Subviews) {
            findAndResignFirstResponder(node:view);
        }
    }

    private bool haveDrag = false;
    public override void TouchesEnded(NSSet touches, UIEvent evt) {
        if (!haveDrag) {
            UITouch touch = (UITouch)evt.AllTouches.AnyObject;
            if (!touch.View.CanBecomeFirstResponder) {
                this.findAndResignFirstResponder(this);
                Console.WriteLine("resign");
            }
        }
        base.TouchesEnded (touches, evt);
    }
    public override void TouchesMoved(NSSet touches, UIEvent evt) {
        haveDrag = true;
        base.TouchesMoved (touches, evt);
    }

    public override void TouchesBegan(NSSet touches, UIEvent evt) {
        haveDrag = false;
        base.TouchesBegan (touches, evt);
    }
 

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