UITextField shouldChangeCharactersInRange输入A到B之间的值

时间:2014-12-10 05:01:56

标签: ios objective-c iphone uitextfield

我在UITextField中遇到问题我想要输入1000到5000之间的值 无论我尝试过什么,我的代码都在这里? 这工作正常,但问题是它的工作只有5到7个值不超过长度

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string  {
  NSCharacterSet *myCharSet = [NSCharacterSet characterSetWithCharactersInString:_demo_str];
  for (int i = 0; i < [string length]; i++) {
    unichar c = [string characterAtIndex:i];
    if ([myCharSet characterIsMember:c]) {
      return YES;
    }
    else
    {
      return NO;
    }
  }
  return YES;
}

2 个答案:

答案 0 :(得分:2)

正如Midhum MP在他的回答中暗示的那样,用户很可能会逐个输入文本字符,因此您不能让大多数小于5000的数字无法满足shouldChangeCharactersInRange条件。例如,如果用户输入1,shouldChangeCharactersInRange应该返回YES,因为用户最终可以继续输入1000.从技术上讲,您可以阻止用户从大于5开始的字符串最终将没有符合标准的6,7,8或9开头的四位数字。

但为了简单起见,我建议只将文本字段条目限制为小于5000的数字,例如:

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

    // First check whether the replacement string's numeric...
    NSCharacterSet *cs = [[NSCharacterSet characterSetWithCharactersInString:@"0123456789"] invertedSet];
    NSString *filtered = [[string componentsSeparatedByCharactersInSet:cs] componentsJoinedByString:@""];
    bool isNumeric = [string isEqualToString:filtered];

    // Combine the new text with the old
    NSString *combinedText = [textField.text stringByReplacingCharactersInRange:range withString:string];

    if ([combinedText intValue] <= 5000) {
        return YES;
    } else {
        return NO;
    }
}

然后,一旦用户通过尝试将文本字段作为第一响应者重新指示他们已完成,您可以检查文本条目是否实际上符合条件。如果条件不满足,那么在textFieldShouldEndEditing:,您可以强制键盘保持为第一响应者,直到输入有效数字,例如:

-(BOOL)textFieldShouldEndEditing:(UITextField *)textField {

    int txtValue = [textField.text intValue];
    if (!(txtValue <= 5000 && txtValue >= 1000)) {
        return NO;
    } else {
        return YES;
    }
}

答案 1 :(得分:1)

使用以下方法处理当前要求并不是一个好主意:

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

因为如果用户输入较小的值,您的代码就会中断。我的建议是这样的:

- (void)textFieldDidEndEditing:(UITextField *)textField
{
   int txtValue = [textField.text intValue];
   if (!(txtValue < 5000 && txtValue > 1000))
   {
       // Invalid value, show an alert
   }
}