web-dev-qa-db-fra.com

Sélectionner par programme tout le texte dans UITextField

Comment puis-je sélectionner par programme tout le texte dans UITextField?

65
Mirko

Il s'avère que l'appel de -selectAll: avec un expéditeur non nul affiche le menu. L'appeler avec nil entraîne la sélection du texte, mais pas l'affichage du menu.

J'ai essayé ceci après que mon rapport de bogue à ce sujet revienne d'Apple avec la suggestion de passer nil à la place de moi.

Pas besoin de perdre du temps avec UIMenuController ou d'autres API de sélection.

45
Rick

Thats ce qui a fait le tour pour moi:

[self.titleField setSelectedTextRange:[self.titleField textRangeFromPosition:self.titleField.beginningOfDocument toPosition:self.titleField.endOfDocument]];

Assez moche, mais ça marche, donc il n'y aura pas de menu partagé affiché!

Pour résoudre le problème "ne fonctionne que toutes les secondes", utilisez ce qui suit:

    __weak typeof(self) weakSelf = self;
dispatch_async(dispatch_get_main_queue(), ^{
    __strong __typeof(weakSelf) strongSelf = weakSelf;
    UITextRange *range = [strongSelf textRangeFromPosition:strongSelf.beginningOfDocument toPosition:strongSelf.endOfDocument];
    [strongSelf setSelectedTextRange:range];
});

Merci à Eric Baker (récemment édité à partir d'un commentaire ici) 

80

Je viens de tester cela pour vérifier le commentaire de Mirko ci-dessus, mais mon test vérifie que selectAll: sélectionne en fait tout le texte lorsqu'il est envoyé à UITextField lui-même. 

Notez que le texte sera immédiatement masqué avec CUT | COPIE | PASTE, mais à votre question, c’est exactement ce qui apparaît quand un utilisateur appuie sur "Sélectionner tout" pour commencer.

La solution que je vais suivre est la suivante: notez que la deuxième ligne masque temporairement la boîte de dialogue CUT/COPY/PASTE, sans la désactiver pour les sélections utilisateur explicites.

[_myTextField selectAll:self];
[UIMenuController sharedMenuController].menuVisible = NO;
48
Justin Searls

Utilisez ce dont vous avez besoin

 [yourtextField becomeFirstResponder]; //puts cursor on text field

 [yourtextField selectAll:nil];        //highlights text

 [yourtextField selectAll:self];       //highlights text and shows menu(cut copy paste)
36
Ted

Rapide

Sélectionnez tout le texte dans une UITextField:

textField.selectedTextRange = textField.textRangeFromPosition(textField.beginningOfDocument, toPosition: textField.endOfDocument)

Ma réponse complète est ici .

8
Suragch

C'est la meilleure solution que j'ai trouvée. No sharedMenuController, et cela fonctionne consécutivement:

    -(void)textFieldDidBeginEditing:(UITextField *)textField
{
    [textField performSelector:@selector(selectAll:) withObject:nil afterDelay:0.1];
}
6
Jase68

Pour pouvoir sélectionner du texte, le champ de texte doit être éditable. Pour savoir quand le champ de texte est éditable, utilisez les méthodes déléguées:

- (void)textFieldDidBeginEditing:(UITextField *)textField
- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField

Je ne pense pas que textFieldShouldBeginEditing: soit obligatoire, mais c'est ce que j'ai utilisé dans mon implémentation.

- (void)textFieldDidBeginEditing:(UITextField *)textField{
    [textField selectAll:textField];
}

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField{
    return YES;
}

Passer à zéro pour sélectionner Tout: ne montrera pas le menu.

3
Jason Daniels

Malheureusement, je ne pense pas que vous puissiez faire cela. 

Je ne suis pas sûr que cela vous aide, mais setClearsOnBeginEditing vous permet de spécifier que UITextField doit supprimer la valeur existante lorsque l'utilisateur commence à modifier (il s'agit de la valeur par défaut pour secure UITextFields). 

1
Dan J

Je crée une vue d'alerte personnalisée contenant une UITextField à l'intérieur. J'ai trouvé un problème dans le champ de texte, c'est que: beginningOfDocument n'a de valeur que si le champ de texte est ajouté à screen & becomeFirstResponder est appelé.

Sinon, beginningOfDocument renvoie nil et [UITextField textRangeFromPosition:] ne peut pas obtenir la valeur.

Voici donc mon exemple de code pour résoudre ce cas.

UIWindow *window = [[[UIApplication sharedApplication] windows] firstObject];
[window addSubview:theAlertView]; // textfield must be added as a subview of screen first
UITextField *textField = theAlertView.textField;
[textField becomeFirstResponder]; // then call to show keyboard and cursor 
UITextRange *range = [textField textRangeFromPosition:textField.beginningOfDocument toPosition:textField.endOfDocument]; // at this time, we could get beginningOfDocument
[textField setSelectedTextRange:range]; // Finally, it works!!!
1
nahung89

Swift 3:

textField.selectAll(self)
1
John Scalo
UITextField *tf = yourTF;
// hide cursor (you have store default color!!!)
[[tf valueForKey:@"textInputTraits"] setValue:[UIColor clearColor]
                                       forKey:@"insertionPointColor"];
// enable selection
[tf selectAll:self];
// insert your string here
// and select nothing (!!!)
[tf setMarkedText:@"Egor"
    selectedRange:NSMakeRange(0, 0)];

Terminé!

0
Sound Blaster