web-dev-qa-db-fra.com

Définir la longueur maximale de UITextField

Existe-t-il un moyen de définir la longueur maximale sur un UITextField?

Quelque chose comme l'attribut MAXLENGTH dans les champs de saisie HTML.

63
Elegya

Cela fonctionne correctement avec le retour arrière et le copier-coller:

#define MAXLENGTH 10

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

    NSUInteger oldLength = [textField.text length];
    NSUInteger replacementLength = [string length];
    NSUInteger rangeLength = range.length;

    NSUInteger newLength = oldLength - rangeLength + replacementLength;

    BOOL returnKey = [string rangeOfString: @"\n"].location != NSNotFound;

    return newLength <= MAXLENGTH || returnKey;
}

PDATE: Mis à jour pour accepter la touche de retour même à MAXLENGTH. Merci Mr Rogers!

240
Tomas Andrle

[~ # ~] mise à jour [~ # ~]

Je ne peux pas supprimer cette réponse car elle est acceptée, mais elle n'était pas correcte. Voici le code correct, copié de TomA ci-dessous:

#define MAXLENGTH 10

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

    NSUInteger oldLength = [textField.text length];
    NSUInteger replacementLength = [string length];
    NSUInteger rangeLength = range.length;

    NSUInteger newLength = oldLength - rangeLength + replacementLength;

    BOOL returnKey = [string rangeOfString: @"\n"].location != NSNotFound;

    return newLength <= MAXLENGTH || returnKey;
}

[~ # ~] original [~ # ~]

Je pense que vous voulez dire UITextField. Si oui, alors il existe un moyen simple.

  1. Implémentez le protocole ITextFieldDelegate
  2. Implémentez le textField:shouldChangeCharactersInRange:replacementString: méthode.

Cette méthode est appelée à chaque pression sur un caractère ou à chaque remplacement de caractère précédent. dans cette méthode, vous pouvez faire quelque chose comme ceci:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
    if ([textField.text length] > MAXLENGTH) {
        textField.text = [textField.text substringToIndex:MAXLENGTH-1];
        return NO;
    }
    return YES;
}
40
coneybeare

Une meilleure fonction qui gère correctement les espaces arrière et limite les caractères à la limite de longueur fournie est la suivante:

#define MAXLENGTH 8

    - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
    {
        int length = [textField.text length] ;
        if (length >= MAXLENGTH && ![string isEqualToString:@""]) {
            textField.text = [textField.text substringToIndex:MAXLENGTH];
            return NO;
        }
        return YES;
    }

À votre santé!

16
Varun Chatterji

Ce code limite le texte tout en vous permettant également de saisir des caractères ou de le coller n'importe où dans le texte. Si le texte résultant est trop long, il modifie les caractères de la plage et tronque le texte résultant à la limite.

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    NSUInteger newLength = [textField.text length] - range.length + [string length];
    if (newLength >= MAXLENGTH) {
        textField.text = [[textField.text stringByReplacingCharactersInRange:range withString:string] substringToIndex:MAXLENGTH];
        return NO;
    }
    return YES;
}
11
Andy Bradbrook

Je pense que ce code ferait l'affaire:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range 
                                                       replacementString:(NSString*)string
{
   if (range.location >= MAX_LENGTH)
      return NO;
    return YES;
}

Avec cette méthode déléguée, vous pouvez empêcher l'utilisateur d'ajouter plus de caractères que MAX_LENGTH à votre champ de texte et l'utilisateur doit être autorisé à entrer des espaces arrière si nécessaire.

4
Roberto Miranda

c'est ainsi que j'ai résolu ce problème. Lorsque la limite maximale est atteinte, il n'essaiera pas d'en ajouter plus ... vous ne pourrez supprimer que les caractères

#define MAX_SIZE ((int) 5)
...

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
    if ([textField.text length] >= MAX_SIZE && ![string isEqualToString:@""]) {
        return NO;
    }

    return YES;
}
2
pedrotorres

Pour moi, cela a fait la magie:

if (textField.text.length >= 10 && range.length == 0)
    return NO;
return YES;
2
vishwa.deepak

Ceci est similaire à la réponse de coneybeare, mais maintenant le champ de texte peut contenir un maximum de symboles MAXLENGTH:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
    if ([textField.text length] > MAXLENGTH - 1) {
        textField.text = [textField.text substringToIndex:MAXLENGTH];
        return NO;
    }
    return YES;
}
1
objcdev.ru

Vous devez être conscient de l'emplacement dans lequel le texte est placé ainsi que de la longueur du texte ajouté (au cas où ils collent plus d'un caractère). Le modèle entre ceux-ci en ce qui concerne la longueur maximale est que leur somme ne doit jamais dépasser la longueur maximale.

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
    NSInteger locationAndStringLengthSum = range.location + [string length];

    if ([textField isEqual:_expirationMonthField]) {
        if (locationAndStringLengthSum > EXP_MONTH_FIELD_MAX_CHAR_LENGTH) {
            return NO;
        }
    }
    else if ([textField isEqual:_expirationYearField]) {
        if (locationAndStringLengthSum > EXP_YEAR_FIELD_MAX_CHAR_LENGTH) {
            return NO;
        }
    }
    else if ([textField isEqual:_securityCodeField]) {
        if (locationAndStringLengthSum > SECURITY_FIELD_MAX_CHAR_LENGTH) {
            return NO;
        }
    }
    else if ([textField isEqual:_zipCodeField]) {
        if (locationAndStringLengthSum > Zip_CODE_MAX_CHAR_LENGTH) {
            return NO;
        }
    }

    return YES;
}
1
David Robles

Je pense qu'il n'y a pas une telle propriété.

Mais le texte que vous attribuez à l'UILabel doit être une chaîne NSS. Et avant d'attribuer cette chaîne à la propriété text de UILabel, vous pouvez par exemple utiliser la méthode suivante de NSString pour recadrer la chaîne à un index donné (votre longueur maximale):

- (NSString *)substringToIndex:(NSUInteger)anIndex
1
schaechtele