401 votes

Comment désactiver le clavier pour UITextView avec la touche retour ?

Dans la bibliothèque de l'IB, l'introduction nous indique que lorsque la return est pressée, le clavier de UITextView disparaîtra. Mais en fait, le return ne peut agir que comme ' \n '.

Je peux ajouter un bouton et utiliser [txtView resignFirstResponder] pour cacher le clavier.

Mais existe-t-il un moyen d'ajouter l'action pour l'option return dans le clavier pour que je n'aie pas besoin d'ajouter UIButton ?

0 votes

Suivez les instructions de cet article de blog : iphonedevelopertips.com/cocoa/

527voto

samvermette Points 20225

Je me suis dit que j'allais plutôt poster l'extrait ici :

Assurez-vous de déclarer votre soutien à la UITextViewDelegate protocole.

- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text {

    if([text isEqualToString:@"\n"]) {
        [textView resignFirstResponder];
        return NO;
    }

    return YES;
}

Mise à jour de Swift 4.0 :

func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
    if text == "\n" {
        textView.resignFirstResponder()
        return false
    }
    return true
}

80 votes

Le problème est que ce n'est pas vraiment un moyen de détecter que l'utilisateur a appuyé sur la touche retour. clé . L'utilisateur peut pâte un caractère de retour dans le champ de texte et vous obtiendriez le même message de délégué. En fait, vous utilisez mal l'affichage du texte. La façon d'écarter le clavier est (1) de ne pas le faire du tout (comme lors de la composition d'un message dans l'application Mail) ou (2) d'avoir un bouton Terminé ailleurs dans l'interface (comme dans l'application Notes). Vous pourriez attacher un tel bouton au clavier, par exemple, en tant que vue accessoire.

0 votes

@ Sam V ce snippet était cool mec. il fonctionne pour moi. merci beaucoup mec. Est-ce qu'il y a un snippet pour dissoudre le clavier numérique ?

0 votes

Magnifique. Juste un rappel que dans certaines situations, pour se débarrasser du clavier, essayez à peu près ce qui suit... [self.view endEditing:YES] ;

367voto

newgenapps_dev Points 23557

UITextView n'a pas de méthodes qui seront appelées lorsque l'utilisateur appuiera sur la touche retour. Si vous souhaitez que l'utilisateur ne puisse ajouter qu'une seule ligne de texte, utilisez une balise UITextField . En appuyant sur la touche retour et en cachant le clavier pendant un UITextView ne suit pas les directives de l'interface.

Même dans ce cas, si vous voulez le faire, mettez en œuvre la fonction textView:shouldChangeTextInRange:replacementText: méthode de UITextViewDelegate et dans ce cas, vérifier si le texte de remplacement est \n , cachez le clavier.

Il existe peut-être d'autres moyens, mais je n'en ai pas connaissance.

1 votes

Merci et la méthode fonctionne bien. La raison d'utiliser UITextView est qu'il peut contenir du texte sur plusieurs lignes. Et maintenant, je l'utilise comme une boîte de message.

28 votes

Il est assez facile de changer la touche retour en "done" en utilisant l'une ou l'autre des méthodes suivantes [textField setReturnKeyType: UIReturnKeyDone]; ou en utilisant le constructeur d'interface

9 votes

Bon, je comprends maintenant que la façon Apple de terminer avec un champ de texte multiligne est d'ajouter done à la barre de menus

85voto

ribeto Points 970

Je sais que la réponse à cette question a déjà été donnée, mais je n'aime pas vraiment utiliser le littéral de la chaîne de caractères pour la nouvelle ligne, alors voici ce que j'ai fait.

- (BOOL)textView:(UITextView *)txtView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text {
    if( [text rangeOfCharacterFromSet:[NSCharacterSet newlineCharacterSet]].location == NSNotFound ) {
        return YES;
    }

    [txtView resignFirstResponder];
    return NO;
}

Mise à jour de Swift 4.0 :

func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
if (text as NSString).rangeOfCharacter(from: CharacterSet.newlines).location == NSNotFound {
    return true
}
txtView.resignFirstResponder()
return false
}

6 votes

Je pourrais le modifier comme ceci : NSRange resultRange = [text rangeOfCharacterFromSet :[NSCharacterSet newlineCharacterSet] options:NSBackwardsSearch] ; Comme il s'agit de toute façon d'un hack, il semble que vérifier la fin de la chaîne pour un retour soit une voie plus sûre.

0 votes

@maxpower Très bon commentaire. De plus, il est préférable de vérifier par rapport au texte remplacé, par ex. NSString *replacedText = [textView.text stringByReplacingCharactersInRange:range withString:text] .

0 votes

Imaginez un utilisateur qui colle un texte copié ailleurs qui contient une nouvelle ligne. Ils seraient probablement confus lorsqu'au lieu d'ajouter le texte, l'application ferme simplement le clavier.

44voto

josebama Points 183

Je sais qu'on a déjà répondu à cette question à de nombreuses reprises, mais voici mon point de vue sur le sujet.

J'ai trouvé les réponses en samvermette y ribeto vraiment utile, et aussi le commentaire de maxpower dans le ribeto Réponse de la Commission. Mais il y a un problème avec ces approches. Le problème que matt mentions dans le samvermette La réponse de l'auteur est que si l'utilisateur veut coller quelque chose avec un saut de ligne à l'intérieur, le clavier se cache sans rien coller.

Mon approche est donc un mélange des trois solutions susmentionnées et consiste à vérifier uniquement si la chaîne saisie est une nouvelle ligne lorsque la longueur de la chaîne est égale à 1, afin de s'assurer que l'utilisateur tape au lieu de coller.

Voici ce que j'ai fait :

- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text {
    NSRange resultRange = [text rangeOfCharacterFromSet:[NSCharacterSet newlineCharacterSet] options:NSBackwardsSearch];
    if ([text length] == 1 && resultRange.location != NSNotFound) {
        [textView resignFirstResponder];
        return NO;
    }

    return YES;
}

0 votes

C'est la meilleure solution pour ce problème. La réponse de samvermette ne tient pas compte de la situation où l'utilisateur veut coller un texte.

37voto

TMilligan Points 1028

Une méthode plus élégante consiste à désactiver le clavier lorsque l'utilisateur appuie sur un élément situé en dehors du cadre du clavier.

Tout d'abord, définissez la vue de votre ViewController sur la classe "UIControl" dans l'inspecteur d'identité de UIBuilder. Faites glisser la vue dans le fichier d'en-tête du ViewController et liez-la en tant qu'action avec l'événement Touch Up Inside, par exemple :

ViewController.h

-(IBAction)dismissKeyboardOnTap:(id)sender;

Dans le fichier principal du ViewController, ViewController.m :

-(IBAction)dismissKeyboardOnTap:(id)sender
    {
         [[self view] endEditing:YES];
    }

Vous pouvez demander un double tap ou un toucher long en utilisant des techniques similaires. Vous devrez peut-être définir votre ViewController comme un UITextViewDelegate et connecter le TextView au ViewController. Cette méthode fonctionne à la fois pour UITextView et UITextField.

Source : Big Nerd Ranch

EDIT : J'aimerais également ajouter que si vous utilisez un UIScrollView, la technique ci-dessus ne fonctionnera peut-être pas aussi facilement avec l'Interface Builder. Dans ce cas, vous pouvez utiliser un UIGestureRecognizer et appeler la méthode [[self view] endEditing:YES] à l'intérieur de celui-ci. Un exemple serait le suivant :

-(void)ViewDidLoad{
    ....
    UITapGestureRecognizer *tapRec = [[UITapGestureRecognizer alloc] 
        initWithTarget:self action:@selector(tap:)];
    [self.view addGestureRecognizer: tapRec];
    ....
}

-(void)tap:(UITapGestureRecognizer *)tapRec{
    [[self view] endEditing: YES];
}

Lorsque l'utilisateur touche à l'extérieur du clavier et ne touche pas un espace de saisie, le clavier se ferme.

1 votes

J'aime l'idée avec GestureRecognizer mais le gros problème est que tous les boutons ou contrôles de la vue ne sont plus cliquables.

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