设置UITextField最大长度

时间:2010-03-26 13:23:17

标签: iphone uitextfield max

有没有办法在UITextField上设置最大长度?

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

11 个答案:

答案 0 :(得分:239)

这适用于退格和复制&粘贴:

#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:已更新,即使在MAXLENGTH时也接受返回键。谢谢罗杰斯先生!

答案 1 :(得分:40)

<强>更新

我无法删除此答案,因为它是可接受的答案,但它不正确。以下是从下面的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;
}

<强> ORIGINAL

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

  1. 实施UITextFieldDelegate协议
  2. 实施textField:shouldChangeCharactersInRange:replacementString:方法。
  3. 在每个字符点击或前一个字符替换时调用该方法。在这种方法中,你可以这样做:

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

答案 2 :(得分:16)

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

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

干杯!

答案 3 :(得分: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;
}

答案 4 :(得分:4)

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

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

使用此委托方法,您可以阻止用户向文本字段添加比MAX_LENGTH更多的字符,并且如果需要,应允许用户输入退格键。

答案 5 :(得分:2)

对我来说这就是魔术:

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

答案 6 :(得分:2)

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

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

答案 7 :(得分:1)

我认为没有这样的财产。

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

- (NSString *)substringToIndex:(NSUInteger)anIndex

答案 8 :(得分:1)

这类似于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;
}

答案 9 :(得分:1)

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

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

答案 10 :(得分:-3)

您需要在ViewDidLoad

上分配代理人
TextFieldname.delegate=self