Comment puis-je sélectionner par programme tout le texte dans UITextField?
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.
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)
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;
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)
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 .
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];
}
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.
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
).
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!!!
Swift 3:
textField.selectAll(self)
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é!