允许在文本字段中仅输入1到9位数字

时间:2012-10-06 18:24:30

标签: ios

我需要允许最终用户输入1-9位数字:

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

        if ([string length] == 0 && range.length > 0){
            textField.text = [textField.text stringByReplacingCharactersInRange:range withString:string];
            return NO;
        }
        NSCharacterSet *nonNumberSet = [[NSCharacterSet characterSetWithCharactersInString:@"0123456789"] invertedSet];
        if ([string stringByTrimmingCharactersInSet:nonNumberSet].length > 0)return YES;
        return NO;
    }

但是仍然可以输入1个以上的数字。 请帮助查找错误。

5 个答案:

答案 0 :(得分:3)

只需将其添加到您的第一个测试中:

if ([newString length] > 1)
    return NO;

答案 1 :(得分:2)

为什么不为此字段指定最大长度为1的数字键盘/小键盘?

UITextField对象具有keyboardType属性。将其设置为UIKeyboardTypeDecimalPad

答案 2 :(得分:1)

Cyrille有正确的答案,但只是为了让你知道为什么它目前没有工作:

当您输入第二个数字时,代码将进入以下if语句:

if([newString length]>=1)
{
    NSString *sepStr=[newString substringToIndex:1];
    return !([sepStr length]>1);
}

总是会返回YES,因为sepStr的长度总是为1。

答案 3 :(得分:0)

NSString *number = @"[0-9]"; 
NSPredicate *numbertest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", number]; 
if ([numbertest evaluateWithObject:yourtextfield.text] != YES)
{
// Display error message
}

只需使用此代码

答案 4 :(得分:0)

使用此代码对我有用(工作代码)

#define ACCEPTABLE_CHARACTERS @“0123456789”

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {     if([textField isEqual:zipCode]){

    NSCharacterSet *cs = [[NSCharacterSet characterSetWithCharactersInString:ACCEPTABLE_CHARACTERS] invertedSet];
    NSString *filtered = [[string componentsSeparatedByCharactersInSet:cs] componentsJoinedByString:@""];
    return [string isEqualToString:filtered];

}

return YES;

}