87 votes

Limiter le nombre de caractères dans l'uitextview

Je donne une vue de texte pour tweeter une certaine chaîne.

J'applique la méthode suivante pour limiter le nombre de caractères à 140.

- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text{
   return [[textView text] length] <= 140;
}

Le code fonctionne bien sauf la première condition qui est que le retour arrière ne fonctionne pas. Supposons que j'ai atteint la limite de 140 caractères, la méthode me donnera false et l'utilisateur ne pourra pas insérer plus de caractères, mais ensuite, lorsque j'essaie de supprimer des caractères, la vue texte se comporte comme si elle était désactivée.

La question est donc la suivante : "Comment supprimer des caractères de textview.text ou réactiver l'affichage du texte ?"

0 votes

Vérifiez ceci réponse

0 votes

177voto

Tim Gostony Points 7276
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
{
    return textView.text.length + (text.length - range.length) <= 140;
}

Cela prend en compte les utilisateurs qui coupent du texte, ou qui suppriment des chaînes de caractères plus longues qu'un seul caractère (c'est-à-dire s'ils sélectionnent puis appuient sur la touche d'espacement arrière), ou qui mettent en surbrillance une plage et collent des chaînes de caractères plus courtes ou plus longues qu'elle.

Version Swift 4.0

 func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
    return textView.text.count + (text.count - range.length) <= 140
}

0 votes

S'agit-il d'une IBAction ? Comment la connecter à l'affichage de texte en question lorsque l'utilisateur tape ?

1 votes

Vous devez faire de votre contrôleur de vue un UITextViewDelegate et ensuite connecter le propriétaire du fichier comme délégué de la vue texte.

0 votes

J'ai pensé qu'il serait plus juste de poser une question de suivi : J'ai des problèmes avec deux UITextviews qui ont besoin de limites de caractères dans le même contrôleur. Pouvez-vous m'aider ? stackoverflow.com/questions/25272413/

68voto

David Gelhar Points 20703

Vous devriez chercher une chaîne vide à la place, car la fonction référence à la pomme dit

Si l'utilisateur appuie sur la touche Suppr, la longueur de la plage est de 1 et un objet chaîne vide remplace cet unique caractère.

Je pense que la vérification que vous voulez faire est quelque chose comme [[textView text] length] - range.length + text.length > 140 pour tenir compte des opérations de couper/coller.

0 votes

Merci mais pouvez-vous être plus précis je ne peux pas comprendre la spécification technique d'apple

0 votes

Dites-moi juste ce que je dois mettre dans la première condition. Je cherche depuis presque 4 heures.

9 votes

Je pense que la vérification que vous voulez faire est quelque chose comme [[textView text] length] - range.length + text.length > 140 pour tenir compte des opérations de couper/coller.

10voto

Saroj Points 334

Cependant, vous pouvez également utiliser le code de travail ci-dessous

- (void)textViewDidChange:(UITextView *)textView{

    NSInteger restrictedLength=140;

    NSString *temp=textView.text;

    if([[textView text] length] > restrictedLength){
        textView.text=[temp substringToIndex:[temp length]-1];
    }
}

0 votes

En général, ce n'est pas la meilleure façon de modifier un élément après qu'il ait été défini. Il vaut mieux vérifier cela dans "shouldChangeCharactersInRange" pour empêcher que le texte soit édité.

4voto

Ballu Points 1354

Ue ce

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{

    int limit = 139;

    return !([textField.text length]>limit && [string length] > range.length);

}

cela n'entrera que 140 caractères et vous pouvez les supprimer si nécessaire.

1voto

Jeev Points 177

Le problème avec certaines des réponses données ci-dessus est que, par exemple, j'ai un champ de texte et je dois fixer une limite de 15 caractères à saisir, puis il s'arrête après la saisie du 15ème caractère, mais il ne permet pas de le supprimer. C'est-à-dire que le bouton de suppression ne fonctionne pas non plus. Comme je faisais face au même problème. J'ai trouvé la solution, donnée ci-dessous. Fonctionne parfaitement pour moi

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
 if(textField.tag==6)
 {
    if ([textField.text length]<=30)
    {
        return YES;   
    }
    else if([@"" isEqualToString:string])
    {
        textField.text=[textField.text substringToIndex:30 ];
    }

    return NO;
 }
 else
 {
    return YES;
 }
}

J'ai un champ de texte, dont j'ai défini la balise "6". et j'ai restreint la limite maximale de caractères = 30 ; cela fonctionne bien dans tous les cas

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