如何限制UITextField中的字符数

8

我有一个UITextField,其限制为只能输入数字,就像以下方法一样。我还想将最大字符数限制为3位数字。我该如何修改我的方法以实现这个目标?

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
NSCharacterSet *aCharacterSet = [NSCharacterSet characterSetWithCharactersInString:@"0123456789"];
for (int i = 0; i < [string length]; i++) {
    unichar aCharacter = [string characterAtIndex:i];
    if ([aCharacterSet characterIsMember:aCharacter]) {
        return YES;
    }
}

NSUInteger newLength = self.textField.text.length + string.length - range.length;
return (newLength > 3) ? NO : YES;
}

为什么有些问题会得到这么多答案呢?也许是因为没有任何一个答案被接受。 - Zaxter
1
这可能会帮助并限制您搜索答案的时间 :) https://dev59.com/33RC5IYBdhLWcg3wCMc6 - Basil Mariano
这肯定会有所帮助!100%准确。https://dev59.com/33RC5IYBdhLWcg3wCMc6 - Basil Mariano
6个回答

14

为了限制文本框的使用,请使用以下代码。

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
     NSString *newString = [textField.text stringByReplacingCharactersInRange:range withString:string];    
        return !([newString length] > 3);

}

你能解释一下 return 语句的作用吗? - TheM00s3
2
如果计划的文本替换应该被允许发生,该方法应返回true,否则返回false。如果新字符串的长度小于或等于3,则返回语句将评估为true。 - Marius Jeskulke
它只允许用户输入三个字符,您不能输入超过3个字符。 - venki

4

您的代码很接近了。尝试这样做:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {

    NSCharacterSet *aCharacterSet = [NSCharacterSet characterSetWithCharactersInString:@"0123456789"];
    for (int i = 0; i < [string length]; i++) {
        unichar aCharacter = [string characterAtIndex:i];
        if (![aCharacterSet characterIsMember:aCharacter]) {
            return NO;
        }
    }

    NSUInteger newLength = self.textField.text.length + string.length - range.length;
    return (newLength > 3) ? NO : YES;
}

2
你可以向UITextFieldTextDidChangeNotification添加观察者。

// 在viewDidLoad中添加以下代码

[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(limitTextField) name:UITextFieldTextDidChangeNotification object:nil];

//dealloc add this 
[[NSNotificationCenter defaultCenter]removeObserver:self name:UITextFieldTextDidChangeNotification object:nil];

//限制文本框字符的方法

-(void)limitTextField
{
   textField.text = [textField.text substringToIndex:3];
}

//或者设置textfield的代理,然后使用以下代码:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
if([textField.text length]<=3)
   return YES;
else
   return NO;
}

将textfield的keyBoardType设置为UIKeyboardTypeNumberPad,以便仅获取数字。我没有测试或编译代码,只是写了逻辑。希望能有所帮助 :)


2

在UITextField中设置最大字符限制和数字验证

在UITextField中设置最大字符限制:我们无法直接为UITextField设置最大长度,因为它的类没有最大长度属性,但可以通过使用以下文本字段委托方法来实现。

#define MAX_LENGTH 20

 – (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {

NSUInteger newLength = [textField.text length] + [string length] – range.length;

if(newLength > MAX_LENGTH){

     return NO;
   }
   else{
            return YES;
   }
}

在文本字段发生改变之前,UITextField会询问代理是否应该更改指定的文本。此时文本字段还没有改变,因此我们获取它的当前长度以及要插入的字符串长度(减去范围长度)。如果这个值太长(例如超过20个字符),则返回NO以禁止更改。 > UITextField中的数字验证
#define NUMBERS_ONLY 0123456789

– (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString*)string 

{
if([textField isEqual:txtPhone])
{
    NSCharacterSet *cs = [[NSCharacterSet characterSetWithCharactersInString:NUMBERS_ONLY] invertedSet];
    NSString *filteredstring  = [[string componentsSeparatedByCharactersInSet:cs] componentsJoinedByString:@””];
    return ([string isEqualToString:filteredstring]);
}
   return  TRUE;
}

0

这样声明

 #define MAX_LENGTH_FULLNAME 3

#pragma mark - TextField Delegate method
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{

    if([string length]==0){
        return YES;
    }
    NSUInteger newLength = [textField.text length] + [string length] - range.length;

    if ([string isEqualToString:@"\n"]) {
        [self.txtAnswer resignFirstResponder];
        return NO;
    }
    if (textField == self.txtFName){
        /* for backspace */
        if([string length]==0){
            return YES;
        }
        if (newLength > MAX_LENGTH_FULLNAME) {
            if([string length] > MAX_LENGTH_FULLNAME){
                textField.text = [string substringToIndex:MAX_LENGTH_FULLNAME];
            }
            return NO;
        }
      NSCharacterSet *myCharSet = [NSCharacterSet characterSetWithCharactersInString:@"1234567890"];


        for (int i = 0; i < [string length]; i++) {
            unichar c = [string characterAtIndex:i];
            if ([myCharSet characterIsMember:c]) {
                return YES;
            }
        }
        return NO;

    }
return YES;
}

要只允许数字,也可以这样定义

[textField setKeyboardType:UIKeyboardTypeNumberPad];

0

试试这个:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
NSCharacterSet *aCharacterSet = [[NSCharacterSet decimalDigitCharacterSet] invertedSet];
NSString *filtered =  [[string componentsSeparatedByCharactersInSet:aCharacterSet] componentsJoinedByString:@""];
if ((textField.text.length >2) && (!(string.length == 0)))
            return NO;
        else
            return [string isEqualToString:filtered];
}

这对我没用。它不让我输入任何文本。 - user594161
代码已修复,请再试一次。 - user523234

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接