设置UITextField最大长度

Ele*_*gya 63 iphone max uitextfield

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

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

Tom*_*rle 240

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

#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;
}
Run Code Online (Sandbox Code Playgroud)

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

  • 这个答案很棒.比接受的更好. (13认同)
  • 我有一个问题,如果我已经在'MAXLENGTH`,Done键就不会被注册.如果在'MAXLENGTH`并且仍然返回'YES`,我必须寻找新行字符.谢谢您的帮助! (2认同)

con*_*are 40

UPDATE

我无法删除这个答案,因为它是被接受的答案,但它不正确.这是从下面的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;
}
Run Code Online (Sandbox Code Playgroud)

原版的

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

  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;
}
Run Code Online (Sandbox Code Playgroud)

  • 这有点缺陷:1)通过检查现有的字段文本长度(而不是建议的新长度),您允许用户超出最大值1个字符,2)它不会阻止用户复制和粘贴更多文字. (11认同)
  • 它应该是`> = MAXLENGTH`和`substringToIndex:MAXLENGTH`. (3认同)
  • 这个解决方案非常糟糕..如果你将maxlength设置为2,你实际上可以输入6个字符.当您按下键盘上的退格按钮时也没有任何反应.第三,当继续输入时,它将替换前一个字符串.请看这个答案,效果更好http://stackoverflow.com/questions/433337/iphone-sdk-set-max-character-length-textfield (3认同)

Var*_*rji 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;
    }
Run Code Online (Sandbox Code Playgroud)

干杯!

  • 当用户粘贴长度超过最大值的字符串时,这个不会阻止长度超过最大值. (4认同)
  • 我相信你不需要对文本字段进行子串 (2认同)

小智 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;
}
Run Code Online (Sandbox Code Playgroud)