【问题标题】:how to do UItextfield should allow only value between Range如何做 UItextfield 应该只允许 Range 之间的值
【发布时间】:2014-12-05 11:05:42
【问题描述】:

我的问题是我必须像用户可以在 Range 中输入值一样...我的范围来自 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;
}

【问题讨论】:

  • “startRange”和“endRange”到底是什么?是这些话吗?数字?咖啡机的索引?这些变量从未在代码中使用。我所看到的只是一个正则表达式(我不明白)。您必须添加更多信息。
  • @MatthiasBauch startRange 和 endRange 是数字
  • 所以你的范围是最大和最小 newString 长度?
  • @Mateusz 是最小和最大长度
  • 很抱歉提出问题,但是有什么理由使用正则表达式进行这种类型的验证吗?为什么不只取起始范围和结束范围值的 ascii 并进行验证?

标签: ios objective-c ios8 uitextfield nscharacterset


【解决方案1】:

我认为只需检查文本字段的length 即可完成。

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

见以下代码:

- (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;
}

【讨论】:

  • 如果有人使用 ios 键盘写东西并且 'a' 会大于 0,这将永远无法工作,你应该删除这行 if(newString.length < a) {return NO;} 并稍后检查。
  • @Mateusz 现在取决于 OP 的要求。我们也可以合并两个条件,但不清楚范围验证有多严格。如果您认为需要任何改进,请随时修改它。
  • @Mateusz 当用户尝试从范围中删除以下字符时,我已经进行了验证。但是您仍然看到它在低于该范围后永远无法删除。
  • 重点是当这个方法返回NO时,文本字段不会改变。例如,如果a 设置为 3,那么即使您在某个键盘字母上敲击 4 次,这也不会更改文本字段,因为每次按下 'newString.length' 都会为 1。但你有正确的:'现在是取决于 OP 的要求'
  • @Kampai 上面的例子不起作用,因为你指定 if(newString.length
猜你喜欢
  • 2012-10-08
  • 2014-04-11
  • 2012-05-30
  • 1970-01-01
  • 1970-01-01
  • 2011-11-24
  • 2021-10-14
  • 2023-02-24
  • 1970-01-01
相关资源
最近更新 更多