iPhone简单的电话号码validation

我发现iphone上的各种电话号码validation,但似乎没有validation,他们似乎只是改变格式。 示例电话号码格式 。

目标:通过警报input此号码。 北美有或没有破折号。

所以有一些代码,但任何想法都是无效的。

- (void)textFieldDidEndEditing:(UITextField *)textField { NSString *str=@"^\\+(?:[0-9] ?){6,14}[0-9]$"; NSPredicate *no=[NSPredicate predicateWithFormat:@"SELF MATCHES %@",str]; if([no evaluateWithObject:textField.text]==NO) { UIAlertView *alert=[[UIAlertView alloc]initWithTitle:@"Warning" message:@"Please Enter correct contact no." delegate:self cancelButtonTitle:@"ok" otherButtonTitles:nil]; [alert show]; [alert release]; } else{ NSString *textValue = textField.text; NSLog(@"Value: %@", textValue); } } 

首先,真正的电话号码validation相当复杂。 您是否仅限于NANP(北美编号计划),还是您在寻找E.164号码? 它看起来像你试图主要匹配E.164,虽然这通常不是大多数人会input的数字。

你的比赛需要一个加号,然后是一个七到十五长的数字序列,在它们之间有可选的空格。 你是这个意思吗? 你传入了什么string?

请注意,截至iOS4, NSRegularExpressionNSPredicate好一点。

编辑 :我再次阅读这个问题,看到你想validation,而不是突出显示电话号码,所以我移动了NSDataDetector的部分。

你可以使用NSDataDetector (这是NSDataDetector一个特殊的子类)来searchNSString的电话号码(我相信这是使用iPhone的默认电话号码检测algorithm)。

 NSDataDetector *detector = [NSDataDetector dataDetectorWithTypes:NSTextCheckingTypePhoneNumber error:&error]; NSUInteger numberOfMatches = [detector numberOfMatchesInString:string options:0 range:NSMakeRange(0, [string length])]; 

如果您使用UITextView (但可能不是您使用的UITextField ),则可以使用iPhone的默认电话号码检测algorithm突出显示电话号码,方法是设置其dataDetectorTypes属性:

 textView.dataDetectorTypes = UIDataDetectorTypePhoneNumber; 

有关其他types的数据检测器,请参阅UIDataDetectorTypes

使用这个validation你只能input10个数字。 你可以根据你的要求改变它的长度。

 - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { BOOL valid = [[NSPredicate predicateWithFormat:@"SELF MATCHES %@", REGEX_FOR_INTEGERS] evaluateWithObject:_textFieldValidate.text]; if(valid){ if(range.length + range.location > textField.text.length) { return NO; } NSUInteger newLength = [textField.text length] + [string length] - range.length; return newLength <= 10; } return YES; } 

希望这会帮助你。