Ios 如何执行UItextfield应只允许范围之间的值

Ios 如何执行UItextfield应只允许范围之间的值,ios,objective-c,ios8,uitextfield,nscharacterset,Ios,Objective C,Ios8,Uitextfield,Nscharacterset,我的问题是我必须像用户一样输入范围内的值。。。我的范围来自json 这是我的代码不管我怎么做。。。这里a,b是我的开始范围,b是结束范围用户可以输入更好的值此范围不超出范围 - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { if (textField) { NSData *dat

我的问题是我必须像用户一样输入范围内的值。。。我的范围来自json

这是我的代码不管我怎么做。。。这里a,b是我的开始范围,b是结束范围用户可以输入更好的值此范围不超出范围

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
  if (textField)
  {
    NSData *data = [((MDCFlowDetails *)_flow).flow_data dataUsingEncoding:NSUTF8StringEncoding];
    id json = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
    NSString *a = [json objectForKey:@"startrange"];
    NSString *b = [json objectForKey:@"endrange"];
    NSString *newString = [textField.text stringByReplacingCharactersInRange:range withString:string];

    NSString *expression = @"^([0-9]+)?(\\.([0-9]{1,2})?)?$";

    NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:expression
                                                                           options:NSRegularExpressionCaseInsensitive
                                                                             error:nil];
    NSUInteger numberOfMatches = [regex numberOfMatchesInString:newString
                                                        options:0
                                                          range:NSMakeRange(0, [newString length])];
    if (numberOfMatches == 0)
        return NO;
}

return YES;
}

我认为只需检查textfield的
长度即可

当用户在文本字段中输入文本时,在范围的低端和高端设置一个条件

见以下代码:

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

        NSData *data = [((MDCFlowDetails *)_flow).flow_data dataUsingEncoding:NSUTF8StringEncoding];
        id json = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
        NSInteger a = [[json objectForKey:@"startrange"] integerValue];
        NSInteger b = [[json objectForKey:@"endrange"] integerValue];

        if (newString.length > a && newString.length > b) {
            // Check both range are satisfied.
            return NO;
        }

    }
    return YES;
}

“星际旅行”和“endRange”到底是什么?这些词是什么?数字?咖啡机的索引?这些变量从未在代码中使用过。我看到的只是一个正则表达式(我不理解)。您必须添加更多信息。@MatthiasBauch startRange和endRange是数字,所以您的范围是最大和最小新字符串长度?@Mateusz是最小和最大长度抱歉提出问题,但是否有任何理由使用正则表达式进行此类验证??为什么不直接获取起始范围和结束范围的ascii值并进行验证?如果有人使用ios键盘写东西,而“a”将大于0,这将永远不会起作用,您应该删除这行
If(newString.length
,然后检查它。@Mateusz这取决于OP的要求。我们也可以合并两个条件,但不清楚范围验证有多严格。如果您认为需要任何改进,请随意修改它。@Mateusz当用户试图从范围中删除下面的字符时,我已经进行了验证。但您仍然可以看到,在低于该范围后,它永远无法删除。关键是,当此方法返回
NO
时,文本字段不会更改。例如,如果
a
设置为3,则即使在某个键盘字母上点击4次,也不会更改文本字段,因为每次按下“newString.length”都将为1。但你说得对:“现在取决于OP的要求”@Kampai上面的例子不起作用,因为你指定了if(newString.length