如何仅在UITextField中输入Numbers并限制最大长度?

时间:2012-02-28 06:43:36

标签: objective-c ios4 uitextfield

在UITextField中,我们只输入数字并限制最多3个数字,我在下面的代码中使用

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


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

    NSCharacterSet *cs = [[NSCharacterSet characterSetWithCharactersInString:NUMBERS_ONLY] invertedSet];

    NSString *filtered = [[string componentsSeparatedByCharactersInSet:cs] componentsJoinedByString:@""];

    while (newLength < CHARACTER_LIMIT) {
        return [string isEqualToString:filtered];
    }

/* Limits the no of characters to be enter in text field */

    return (newLength > CHARACTER_LIMIT ) ? NO : YES; 

}

当我长按文本字段(如下图)并在两个数字之间输入字符串时,它也允许所有特殊字符和租船人。  enter image description here

5 个答案:

答案 0 :(得分:40)

不是我不喜欢the answer I wrote at this question,这里也是copy & pasted。我会尝试解释你的错误。

这个答案基于这样的假设:你的常量定义如下:

#define NUMBERS_ONLY @"1234567890"
#define CHARACTER_LIMIT 3

您的逻辑失败的原因是,当newLength等于CHARACTER_LIMIT时,您永远不会处理该事件。

为了说明假设您的textfield为空并且您要求将字符串@"ABC"粘贴到文本字段,则会调用您的委托方法。您创建正确计算为空字符串的字符串filtered,您不能等待执行行return [string isEqualToString:filtered];,但您实际上从未评估该行,因为您不满足该行的条目要求while循环,因为newLength是3.所以简单return (newLength > CHARACTER_LIMIT ) ? NO : YES;决定返回值。

如果您的CHARACTER_LIMIT由于某种原因实际上是4,那么只需将@"ABCD"想象为逻辑仍然适用的字符串。

这是一个简单的功能修正工作示例。我再次假设CHARACTER_LIMIT等于3。

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string  {
    NSUInteger newLength = [textField.text length] + [string length] - range.length;
    NSCharacterSet *cs = [[NSCharacterSet characterSetWithCharactersInString:NUMBERS_ONLY] invertedSet];
    NSString *filtered = [[string componentsSeparatedByCharactersInSet:cs] componentsJoinedByString:@""];
    return (([string isEqualToString:filtered])&&(newLength <= CHARACTER_LIMIT));
}

答案 1 :(得分:5)

 -(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{
    // Check for non-numeric characters
    NSUInteger lengthOfString = string.length;
    for (NSInteger loopIndex = 0; loopIndex < lengthOfString; loopIndex++) {
        unichar character = [string characterAtIndex:loopIndex];
        if (character < 48) return NO; // 48 unichar for 0
        if (character > 57) return NO; // 57 unichar for 9
    }
    // Check for total length
    NSUInteger proposedNewLength = textField.text.length - range.length + string.length;
    if (proposedNewLength > 3) return NO;
    return YES;
    }

它的工作正常我可以使用此代码

答案 2 :(得分:1)

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
    NSString *s = [textField.text stringByReplacingCharactersInRange:range withString:string];
    NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"^\\d{0,3}$" options:0 error:nil];
    NSTextCheckingResult *match = [regex firstMatchInString:s options:0 range:NSMakeRange(0, [s length])];
    return (match != nil);
}

答案 3 :(得分:0)

检查UITextFieldDelegate方法

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

每次键入/点击一个字符或按下剪切/粘贴之后,在该操作更改显示的字符之前,将调用此方法。在这里,您可以检查maxLength和仅数字文本输入(通过使用下面给出的RegularExpression模式),然后返回YES或NO。如果您返回YES,它将进行更改,否则不会。希望这能清除你的怀疑。

答案 4 :(得分:0)

我更喜欢使用NSNumberFormatter来验证文本是否可以解析为数字。如果字符串无法转换为数字,NSNumberFormatter将返回nil。这使您可以对输入作出反应(即使文本变为红色,发出警报)

NSNumber* value = nil;
NSNumberFormatter* format = [[NSNumberFormatter alloc] init];
value  = [format numberFromString:someValueString];//returns and
if (value == nil){
    //do something useful i.e. show alert
}