Set UITextField maximale lengte

Is er een manier om de maximale lengte op een UITextField in te stellen?

Zoiets als het MAXLENGTH-attribuut in HTML-invoervelden.


Antwoord 1, autoriteit 100%

Dit werkt correct met backspace en kopieer & plakken:

#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;
}

UPDATE:geüpdatet om de return-toets te accepteren, zelfs wanneer op MAXLENGTH. Bedankt meneer Rogers!


Antwoord 2, autoriteit 17%

UPDATE

Ik kan dit antwoord niet verwijderen omdat het het geaccepteerde antwoord is, maar het was niet correct. Hier is de juiste code, gekopieerd van TomA hieronder:

#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;
}

ORIGINEEL

Ik denk dat je UITextField bedoelt. Zo ja, dan is er een eenvoudige manier.

  1. Implementeer het UITextFieldDelegate-protocol
  2. Implementeer de methode textField:shouldChangeCharactersInRange:replacementString:.

Die methode wordt aangeroepen bij elke tekentap of eerdere tekenvervanging. bij deze methode kun je zoiets als dit doen:

- (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;
}

Antwoord 3, autoriteit 7%

Een betere functie die backspaces correct verwerkt en de tekens beperkt tot de opgegeven lengtelimiet is de volgende:

#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;
    }

Proost!


Antwoord 4, autoriteit 5%

Deze code beperkt de tekst terwijl u ook tekens kunt invoeren of overal in de tekst kunt plakken. Als de resulterende tekst te lang zou zijn, worden de tekens in het bereik gewijzigd en wordt de resulterende tekst tot het uiterste afgekapt.

- (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;
}

Antwoord 5, autoriteit 2%

Ik denk dat deze code de oplossing zou zijn:

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

Met deze gedelegeerde methode kunt u voorkomen dat de gebruiker meer tekens dan MAX_LENGTH aan uw tekstveld toevoegt en dat de gebruiker indien nodig backspaces mag invoeren.


Antwoord 6

Voor mij deed dit de magie:

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

Antwoord 7

zo heb ik dat probleem opgelost. Wanneer de maximale limiet is bereikt, zal het niet proberen meer toe te voegen… je kunt alleen tekens verwijderen

#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;
}

Antwoord 8

Ik denk dat zo’n eigenschap niet bestaat.

Maar de tekst die u aan het UILabel toewijst, moet een NSString zijn. En voordat u deze string toewijst aan de UILabel’s text-eigenschap, kunt u bijvoorbeeld de volgende methode van NSString gebruiken om de string bij een bepaalde index (uw maxlength) bij te snijden:

- (NSString *)substringToIndex:(NSUInteger)anIndex

Antwoord 9

Dit is vergelijkbaar met het antwoord van coneybeare, maar nu kan het tekstveld maximaal MAXLENGTH-symbolen bevatten:

- (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;
}

Antwoord 10

Je moet op de hoogte zijn van de locatie waar de tekst wordt geplaatst, evenals de lengte van de tekst die wordt toegevoegd (voor het geval er meer dan één teken wordt geplakt). Het patroon tussen deze met betrekking tot de maximale lengte is dat hun som nooit de maximale lengte mag overschrijden.

- (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;
}

Antwoord 11

U moet een gemachtigde toewijzen op ViewDidLoad

TextFieldname.delegate=self

Other episodes