我在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;
}
答案 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
}
}