我需要帮助查看文本字段的代码,确保它以(+或 - )开头,然后有3个整数。
所以有效数据看起来像+234或-888
所以我已经启动了这段代码,但它有2个问题
它正确验证只输入了4个字符。但由于某种原因,您必须将焦点从文本区域移开,以便键盘上的“完成”按钮可以触发和隐藏键盘。如果我只在文本字段中输入少于4个字符,那么完成按钮工作正常。但我不希望用户输入任何东西,只有4个字符,然后按完成并隐藏键盘。这是第一个问题....
我不熟悉正则表达式以及如何在iphone中使用它们。所以我需要为这个代码添加正则表达式以满足上述要求。
-(BOOL)textField:(UITextField*)textFieldshouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
NSString *newString = [textField.text stringByReplacingCharactersInRange:range withString:string];
return !([newString length] > 4);
}
//Done button to hide the keyboard
-(IBAction)Done:(id)sender
{
}
答案 0 :(得分:31)
我不确定您是如何处理用户输入和反馈的。首先,如果她的输入无效,我将展示一种简单的方法让用户保持textField的编辑模式。
首先是两个委托方法:
- (BOOL)textFieldShouldReturn:(UITextField *)aTextField
{
[aTextField resignFirstResponder];
return YES;
}
- (BOOL)textFieldShouldEndEditing:(UITextField *)aTextField
{
return [self validateInputWithString:aTextField.text];
}
测试方法,无论输入是否有效,只返回YES或NO:
- (BOOL)validateInputWithString:(NSString *)aString
{
NSString * const regularExpression = @"^([+-]{1})([0-9]{3})$";
NSError *error = NULL;
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:regularExpression
options:NSRegularExpressionCaseInsensitive
error:&error];
if (error) {
NSLog(@"error %@", error);
}
NSUInteger numberOfMatches = [regex numberOfMatchesInString:aString
options:0
range:NSMakeRange(0, [aString length])];
return numberOfMatches > 0;
}
就是这样。但是,我建议向用户显示一些实时状态,无论他的输入是否正常。添加以下通知,例如在viewDidLoad方法中:
- (void)viewDidLoad
{
// ...
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(validateInputCallback:)
name:@"UITextFieldTextDidChangeNotification"
object:nil];
}
- (void)validateInputCallback:(id)sender
{
if ([self validateInputWithString:textField.text]) {
// For example turn a label green and let it say: "OK"
} else {
// For example turn a label red and let it say: "Allowed: + or minus followed by exactly three digits"
}
}
最后:如果您需要访问正则表达式的捕获组(+或 - 和数字),以下代码将有所帮助:
// ... reg ex creation ...
NSArray *matches = [regex matchesInString:aString
options:0
range:NSMakeRange(0, [aString length])];
for (NSTextCheckingResult *match in matches) {
for (int i = 0; i < [match numberOfRanges]; i++) {
NSLog(@"range %d: %d %d", i, [match rangeAtIndex:i].location, [match rangeAtIndex:i].length);
NSLog(@"substring %d: %@", i, [aString substringWithRange:[match rangeAtIndex:i]]);
}
}
答案 1 :(得分:10)
使用正则表达式
验证电子邮件 ID或电话号码Ddelegate方法:
- (BOOL)textFieldShouldReturn:(UITextField *)aTextField
{
[aTextField resignFirstResponder];
return YES;
}
- (BOOL)textFieldShouldEndEditing:(UITextField *)aTextField
{
return [self validateEmail:aTextField.text]; // Change validateEmail to validatePhone for phone validation.
}
无论输入是否有效,都返回YES或NO:
- (BOOL) validateEmail: (NSString *) candidate {
NSString *emailRegex = @"[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}";
NSPredicate *emailTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", emailRegex];
return [emailTest evaluateWithObject:candidate];
}
- (BOOL) validatePhone: (NSString *) candidate {
NSString *phoneRegex = @"^+(?:[0-9] ?){6,14}[0-9]$";
NSPredicate *phoneTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", phoneRegex];
return [phoneTest evaluateWithObject:candidate];
}
答案 2 :(得分:3)
我正在离开问题标题,但恕我直言,考虑到你需要的东西,最好使用UIPickerView有一个“旋转轮”类型的条目,就像你在设置闹钟时在时钟应用程序中做的那样。它可以从“+000”开始,用户可以根据需要翻转四个轮子中的一些([+ - ]。[0-9],[0-9],[0-9])
答案 3 :(得分:0)
在UITextFieldDelegate
中实施-textField:shouldChangeCharactersInRange:replacementString
并使用NSRegularExpression
验证更改。