代码之家  ›  专栏  ›  技术社区  ›  Elegya

设置uitextfield最大长度[重复]

  •  62
  • Elegya  · 技术社区  · 14 年前

    这个问题已经有了答案:

    有没有办法设置uitextfield的最大长度?

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

    11 回复  |  直到 6 年前
        1
  •  238
  •   Tomas Andrle    12 年前

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

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

    更新: 更新以接受返回键,即使在maxlength时也是如此。谢谢罗杰斯先生!

        2
  •  40
  •   coneybeare    11 年前

    更新

    我不能删除这个答案,因为它是被接受的答案,但它不正确。以下是从TOMA复制的正确代码:

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

    原件

    我想你是说乌特extfield。如果是,那么有一个简单的方法。

    1. 实施 UITextFieldDelegate 协议
    2. 实施 textField:shouldChangeCharactersInRange:replacementString: 方法。

    在每个字符点击或上一个字符替换时调用该方法。在这个方法中,您可以这样做:

    - (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;
    }
    
        3
  •  16
  •   Stunner    9 年前

    正确处理退格并将字符限制为提供的长度限制的更好功能如下:

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

    干杯!

        4
  •  11
  •   Andy Bradbrook    11 年前

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

    - (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;
    }
    
        5
  •  4
  •   Roberto Miranda    13 年前

    我认为这段代码可以做到:

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

    使用此委托方法,可以防止用户向文本字段添加超过最大长度的字符,如果需要,应允许用户输入退格符。

        6
  •  2
  •   Bo Persson tox    12 年前

    对我来说,这就是魔法:

    if (textField.text.length >= 10 && range.length == 0)
        return NO;
    return YES;
    
        7
  •  2
  •   Peter Kreinz    6 年前

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

    #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;
    }
    
        8
  •  1
  •   schaechtele    14 年前

    我想没有这样的财产。

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

    - (NSString *)substringToIndex:(NSUInteger)anIndex
    
        9
  •  1
  •   Michael Myers KitsuneYMG    12 年前

    这与Coneybeare的答案类似,但现在文本字段最多可以包含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;
    }
    
        10
  •  1
  •   David Robles    12 年前

    您必须知道文本放置的位置以及要添加的文本的长度(如果它们粘贴了多个字符)。它们之间关于最大长度的模式是,它们的和不应该超过最大长度。

    - (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;
    }
    
        11
  •  -3
  •   Kirk Woll    12 年前

    您需要在上分配代理 ViewDidLoad

    TextFieldname.delegate=self