8
votes

Limiter la longueur de la chaîne collé dans UITEXTVIEW ou UITEXTFIELD

Le problème des chaînes de limitation directement entrées dans un UITEXTVIEW ou UITEXTFIELD a été abordé à ce sujet avant:

  • iPhone SDK: Set Textfield de longueur maximale de caractères
  • iPhone SDK 3.0 problème

    Cependant, avec OS 3.0 Copy-and-Coller devient un problème, car les solutions dans les questions ci-dessus n'empêchent pas de coller des caractères supplémentaires (c'est-à-dire que vous ne pouvez pas taper plus de 10 caractères dans un champ configuré avec ce qui précède avec ce qui précède. Solutions mais vous pouvez facilement coller 100 caractères dans le même champ).

    existe-t-il un moyen d'empêcher une chaîne directement entrée et débordement de string collé?


8 Réponses :


0
votes

Une des réponses dans la première question que vous avez liée ci-dessus doit fonctionner, à savoir utiliser quelque chose comme xxx

surveiller les modifications apportées au texte de l'UITEXTFIELD et raccourcissez-la lorsque cela est approprié. < / p>


1 commentaires

Dans ce cas particulier, conformément à UitextViewDelegate (ou UitextFieldelegate) est préférable de rouler votre propre notification (et plus facile à déboguer). Et je devrais probablement poster comment j'ai effectivement tiré cette question ...



10
votes

J'ai pu limiter le texte entré et collé en se conformant à TextViewDidChange: méthode dans le protocole UITEXTVIEWELEGATEGATE.

- (void)textViewDidChange:(UITextView *)textView
{
    if (textView.text.length >= 10)
    {
        textView.text = [textView.text substringToIndex:10];
    }
}


1 commentaires

Cela provoque un crash lorsque je 'annulerai ". Voir ma réponse pour une solution «légèrement».



7
votes

Dans mon expérience, implémenter la méthode de déléguée:

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


1 commentaires

Pas coller si le texte est trop long n'est pas idéal



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

  if(string.length>10){
    return NO;
  }
  return YES;
}

0 commentaires

6
votes

Modification du texte après l'inséré dans TextViewDidChange: provoque l'interruption de l'application si l'utilisateur appuie sur "Annuler" après la pâte.

J'ai joué autour d'un peu et j'ai pu obtenir une solution de travail. Fondamentalement, la logique est, ne permettez pas à la pâte si la longueur totale est supérieure aux caractères max, détectez la quantité survolée et insérez uniquement la chaîne partielle.

Utilisation de cette solution votre carte de pâte et annulation Travailler comme prévu. xxx


3 commentaires

Cela peut être fait sans la DISPATCH_ASYNC. DISTATCH_ASYNC provoquera un crash sur iOS8 avec la fonction de nouveau type à venir. Je vais retravailler le code bientôt.


Passage nil comme premier argument à PositionFomposition: Décalage: n'est pas autorisé.


Cela crée un crash si vous frappez Redo deux fois. Tout changement pour empêcher ce crash? Merci



0
votes

De plus, la longueur de la chaîne comme dans '[Longueur de la chaîne]' est une chose, mais on doit souvent tronquer à un nombre d'octets dans un certain codage. J'avais besoin de tronquer la frappe et le coller dans un UITEXTVIEW à un nombre maximum UTF8, voici comment je l'ai fait. (Faire quelque chose de similaire pour Uitextfield est un exercice au lecteur.)

nsstring + troncateTeuf8.h xxx

nsstring + troncateTeuf8.m xxx

myViewController.m xxx


1 commentaires

Merci mec! Cet extrait m'a aidé à comprendre la bonne façon de remplacer le texte dans un champ de texte! J'ai fait une version Swift 3: gist.github.com/blackjacx/2198D86442EC9B9B05C0801F4E392047



0
votes

Vous pouvez connaître la chaîne colletée si vous recherchez string.length code> dans DOIGCHANGECHARACTERSIN Plage: Code> Méthode de déléguée

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    if string.length > 1 {
        //pasted string
        // do you stuff like trim
    } else {
        //typed string
    }
    return true
}


2 commentaires

Pouvez-vous en mettre en œuvre un peu plus clairement., comme si je veux que le champ de texte prenne toujours les lettres de FirSr 6?


@Thaotran pour avoir pris les six premiers chiffres, vous pouvez utiliser string.prefix (6) pour prendre les six premiers chiffres de la chaîne collé à l'intérieur de la section String.length> 1 condition.



1
votes

Ce code ne permettra pas à l'utilisateur de saisir plus de caractères que de MaxCharacters. La commande Coller ne fera rien, si le texte collé dépassera cette limite. xxx


0 commentaires