关于iPhone:设置UITextField最大长度

Set UITextField Maximum Length

本问题已经有最佳答案,请猛点这里访问。

有什么办法可以设置UITextField的最大长度吗?

类似HTML输入字段中的MAXLENGTH属性。


这可以与退格键一起正常工作并复制并粘贴:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#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: @"
"].location != NSNotFound;

    return newLength <= MAXLENGTH || returnKey;
}

更新:更新为即使在MAXLENGTH时也接受返回键。谢谢罗杰斯先生!


更新

我不能删除此答案,因为它是公认的答案,但是它是不正确的。这是正确的代码,复制自下面的TomA:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#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: @"
"].location != NSNotFound;

    return newLength <= MAXLENGTH || returnKey;
}

原版的

我认为您的意思是UITextField。如果是,那么有一个简单的方法。

  • 实现UITextFieldDelegate协议
  • 实现textField:shouldChangeCharactersInRange:replacementString:方法。
  • 每次敲击字符或替换先前的字符时都会调用该方法。在这种方法中,您可以执行以下操作:

    1
    2
    3
    4
    5
    6
    7
    - (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;
    }


    更好的功能可以正确处理退格键,并将字符限制为提供的长度限制:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #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;
        }

    干杯!


    此代码限制了文本,同时还允许您输入字符或将任何位置粘贴到文本中。如果结果文本太长,则会更改范围内的字符,并将结果文本截断到极限。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    - (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;
    }

    我认为这段代码可以解决问题:

    1
    2
    3
    4
    5
    6
    7
    - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range
                                                           replacementString:(NSString*)string
    {
       if (range.location >= MAX_LENGTH)
          return NO;
        return YES;
    }

    使用此委托方法,可以防止用户在文本字段中添加超过MAX_LENGTH个字符,并且应允许用户在需要时输入退格键。


    这就是我解决这个问题的方式。当达到最大限制时,它将不会尝试添加更多...您将只能删除字符

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #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;
    }


    对我来说,这是神奇的事情:

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

    您必须知道文本的放置位置以及要添加的文本的长度(以防它们粘贴多个字符)。它们之间关于最大长度的模式是它们的总和永远都不能超过最大长度。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    - (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;
    }

    这类似于锥虫的答案,但是现在文本字段最多可以包含MAXLENGTH个符号:

    1
    2
    3
    4
    5
    6
    7
    - (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;
    }


    我认为没有这样的财产。

    但是分配给UILabel的文本必须是NSString。并且在将此字符串分配给UILabel的text属性之前,您可以例如使用以下NSString方法在给定索引(您的maxlength)处裁剪该字符串:

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


    您需要在ViewDidLoad上分配委托

    1
    TextFieldname.delegate=self