Iphone UITextField验证
我正在创建一个文本字段 每当文本字段中的值大于100时,我需要显示一条警告,说明“值必须小于100”,然后文本字段的值应清除Iphone UITextField验证,iphone,ios,objective-c,Iphone,Ios,Objective C,我正在创建一个文本字段 每当文本字段中的值大于100时,我需要显示一条警告,说明“值必须小于100”,然后文本字段的值应清除 如何执行此操作?您可以让视图控制器符合UITextFieldDelegate协议,并实现-textField:shouldChangeCharactersRange:replacementString:方法: - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)
如何执行此操作?您可以让视图控制器符合
UITextFieldDelegate
协议,并实现-textField:shouldChangeCharactersRange:replacementString:
方法:
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
if (range.location == 0 && string.length == 0) {
return YES;
}
// Build up the resulting string…
NSMutableString *fullString = [[NSMutableString alloc] init];
[fullString appendString:[textField.text substringWithRange:NSMakeRange(0, range.location)]];
[fullString appendString:string];
// Set up number formatter…
NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
NSNumber *replaceNumber = [formatter numberFromString:fullString];
[fullString release];
[formatter release];
return !(replaceNumber == nil || [replaceNumber intValue] > 100);
}
< >要建立完整的字符串,必须考虑文本字段中间的编辑。对上面发布的代码进行了一些更改
-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
BOOL result = NO;
// Build the final string...
NSMutableString *fullString = [[NSMutableString alloc] init];
NSUInteger firstChunkLength = range.location;
NSUInteger secondChunkStart = range.location + range.length;
NSUInteger secondChunkLength = [textField.text length] - secondChunkStart;
[fullString appendString:[textField.text substringWithRange:NSMakeRange( 0, firstChunkLength )]];
[fullString appendString:string];
[fullString appendString:[textField.text substringWithRange:NSMakeRange( secondChunkStart, secondChunkLength )]];
NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
NSNumber *replaceNumber = [formatter numberFromString:fullString];
NSNumber *originalNumber = [formatter numberFromString:textField.text];
result = ( replaceNumber != nil && replaceNumber != originalNumber );
[fullString release];
[formatter release];
return result;
}
此方法用于仅验证UItextfield的数值 这是一个完美的整数验证
- (BOOL) textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
NSCharacterSet *nonNumberSet = [[NSCharacterSet characterSetWithCharactersInString:@"0123456789."] invertedSet];
return ([string stringByTrimmingCharactersInSet:nonNumberSet].length > 0);
}
谢天谢地,现在我们有了Swift,这就容易多了。您确实需要构造预期字符串(希望当Apple在Swift中重写Cocoa时,此接口将添加该字符串) 同时,这里有一个简单的单行程序:
let constructedString = (self.inputField.text! as NSString).stringByReplacingCharactersInRange(range, withString: string)
请注意,self.inputField当然是该字段的出口。此外,转换为NSString是因为我们传递的范围是NSRange。我创建了一个类(UItextField的子类),该类允许用户非常轻松地添加验证。例如
JSInputField *inputField = [[JSInputField alloc] initWithFrame:CGRectMake(10, 100, 300, 50)];
[self.view addSubview:inputField];
[inputField setPlaceholder:@"Enter Text"];
[inputField setRoundedCorners:UIRectCornerAllCorners];
[inputField addValidationRule:JSCreateRuleNotNullValue]; //This will validate field for null value. It will show error if field is empty.
[inputField addValidationRule:JSCreateRuleNumeric(2)]; //This will validate field for numeric values and restrict to enter value upto 2 decimal places.
很好,感谢您对顶部答案的改进:)不过要提醒一句:这对“安全”字段不起作用,因为在这些字段中开始编辑会清除字段,并且不会发送shouldChangeCharactersInRange消息。更改后,您仍然需要检查值,以查看其实际结果。请解释您正在执行的操作,不要只是发布代码,因为这对用户没有帮助。在这种情况下,文本字段可能不是最合适的控件选择。使用具有最小值和最大值的选择器。不需要用户的额外验证或通知。