在UITextField中,我们只输入数字并限制最多3个数字,我在下面的代码中使用
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
NSUInteger newLength = [textField.text length] + [string length] - range.length;
NSCharacterSet *cs = [[NSCharacterSet characterSetWithCharactersInString:NUMBERS_ONLY] invertedSet];
NSString *filtered = [[string componentsSeparatedByCharactersInSet:cs] componentsJoinedByString:@""];
while (newLength < CHARACTER_LIMIT) {
return [string isEqualToString:filtered];
}
/* Limits the no of characters to be enter in text field */
return (newLength > CHARACTER_LIMIT ) ? NO : YES;
}
当我长按文本字段(如下图)并在两个数字之间输入字符串时,它也允许所有特殊字符和租船人。
答案 0 :(得分:40)
不是我不喜欢the answer I wrote at this question,这里也是copy & pasted。我会尝试解释你的错误。
这个答案基于这样的假设:你的常量定义如下:
#define NUMBERS_ONLY @"1234567890"
#define CHARACTER_LIMIT 3
您的逻辑失败的原因是,当newLength
等于CHARACTER_LIMIT
时,您永远不会处理该事件。
为了说明假设您的textfield为空并且您要求将字符串@"ABC"
粘贴到文本字段,则会调用您的委托方法。您创建正确计算为空字符串的字符串filtered
,您不能等待执行行return [string isEqualToString:filtered];
,但您实际上从未评估该行,因为您不满足该行的条目要求while循环,因为newLength
是3.所以简单return (newLength > CHARACTER_LIMIT ) ? NO : YES;
决定返回值。
如果您的CHARACTER_LIMIT
由于某种原因实际上是4,那么只需将@"ABCD"
想象为逻辑仍然适用的字符串。
这是一个简单的功能修正工作示例。我再次假设CHARACTER_LIMIT
等于3。
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
NSUInteger newLength = [textField.text length] + [string length] - range.length;
NSCharacterSet *cs = [[NSCharacterSet characterSetWithCharactersInString:NUMBERS_ONLY] invertedSet];
NSString *filtered = [[string componentsSeparatedByCharactersInSet:cs] componentsJoinedByString:@""];
return (([string isEqualToString:filtered])&&(newLength <= CHARACTER_LIMIT));
}
答案 1 :(得分:5)
-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{
// Check for non-numeric characters
NSUInteger lengthOfString = string.length;
for (NSInteger loopIndex = 0; loopIndex < lengthOfString; loopIndex++) {
unichar character = [string characterAtIndex:loopIndex];
if (character < 48) return NO; // 48 unichar for 0
if (character > 57) return NO; // 57 unichar for 9
}
// Check for total length
NSUInteger proposedNewLength = textField.text.length - range.length + string.length;
if (proposedNewLength > 3) return NO;
return YES;
}
它的工作正常我可以使用此代码
答案 2 :(得分:1)
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
NSString *s = [textField.text stringByReplacingCharactersInRange:range withString:string];
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"^\\d{0,3}$" options:0 error:nil];
NSTextCheckingResult *match = [regex firstMatchInString:s options:0 range:NSMakeRange(0, [s length])];
return (match != nil);
}
答案 3 :(得分:0)
检查UITextFieldDelegate
方法
- (BOOL) textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
每次键入/点击一个字符或按下剪切/粘贴之后,在该操作更改显示的字符之前,将调用此方法。在这里,您可以检查maxLength和仅数字文本输入(通过使用下面给出的RegularExpression模式),然后返回YES或NO。如果您返回YES,它将进行更改,否则不会。希望这能清除你的怀疑。
答案 4 :(得分:0)
我更喜欢使用NSNumberFormatter来验证文本是否可以解析为数字。如果字符串无法转换为数字,NSNumberFormatter将返回nil。这使您可以对输入作出反应(即使文本变为红色,发出警报)
NSNumber* value = nil;
NSNumberFormatter* format = [[NSNumberFormatter alloc] init];
value = [format numberFromString:someValueString];//returns and
if (value == nil){
//do something useful i.e. show alert
}