UITextView 识别链接、电话、地址
识别一段文字中是否包含链接/电话/地址我们只需要设置
UITextView
这个属性就OK了
self.textView.dataDetectorTypes = UIDataDetectorTypePhoneNumber;
self.textView.editable = NO;
编辑模式设为NO,才可以开启识别模式
type枚举类型
typedef NS_OPTIONS(NSUInteger, UIDataDetectorTypes) {
UIDataDetectorTypePhoneNumber = 1 << 0, // Phone number detection
UIDataDetectorTypeLink = 1 << 1, // URL detection
UIDataDetectorTypeAddress NS_ENUM_AVAILABLE_IOS(4_0) = 1 << 2, // Street address detection
UIDataDetectorTypeCalendarEvent NS_ENUM_AVAILABLE_IOS(4_0) = 1 << 3, // Event detection
UIDataDetectorTypeShipmentTrackingNumber NS_ENUM_AVAILABLE_IOS(10_0) = 1 << 4, // Shipment tracking number detection
UIDataDetectorTypeFlightNumber NS_ENUM_AVAILABLE_IOS(10_0) = 1 << 5, // Flight number detection
UIDataDetectorTypeLookupSuggestion NS_ENUM_AVAILABLE_IOS(10_0) = 1 << 6, // Information users may want to look up
UIDataDetectorTypeNone = 0, // Disable detection
UIDataDetectorTypeAll = NSUIntegerMax // Enable all types, including types that may be added later
} __TVOS_PROHIBITED;
如果我们想判断一个stirng
里面是否包含 电话号码 URL 地址 日期 还在为写一正则而苦恼😞?
NSDataDetector 可以轻松帮我们搞定
使用:
NSString * string = @"欢迎访问http://www.111cn.net,https://111cn.net\n以及ftp://111cn.net";
NSError * error = nil;
NSDataDetector * detector = [NSDataDetector dataDetectorWithTypes:NSTextCheckingTypePhoneNumber| NSTextCheckingTypeLink error:&error];
NSUInteger numberOfMatches = [detector numberOfMatchesInString:string options:0 range:NSMakeRange(0, [string length])];
matches(in:options:range:)的用法:
查看一共有多少匹配项.还有matches(in:options:range:)和firstMatch(in:options:range:)
NSString * string = @"欢迎访问http://www.jianshu.com/users/72ee5da886ff/latest_articles. 咱的电话是012-1304445928.ps:电话随便写的哟.今天是2016-10-25,天气(weather)不错";
NSString * string = @"欢迎访问http://www.jianshu.com/users/72ee5da886ff/latest_articles. 咱的电话是012-1304445928.ps:电话随便写的哟.今天是2016-10-25,天气(weather)不错";
NSError * error = nil;
NSDataDetector * detector = [NSDataDetector dataDetectorWithTypes:NSTextCheckingTypeLink|NSTextCheckingTypePhoneNumber error:&error];
NSArray *matches = [detector matchesInString:string
options:0
range:NSMakeRange(0, [string length])];
for (NSTextCheckingResult *match in matches) {
NSRange matchRange = [match range];
if ([match resultType] == NSTextCheckingTypeLink) {
NSURL *url = [match URL];
NSLog(@"url:%@", url);
} else if ([match resultType] == NSTextCheckingTypePhoneNumber) {
NSString *phoneNumber = [match phoneNumber];
NSLog(@"phoneNumber:%@", phoneNumber);
}
}
块用法
NSString * string = @"欢迎访问http://www.jianshu.com/users/72ee5da886ff/latest_articles. 咱的电话是012-1304445928.ps:电话随便写的哟.今天是2016-10-25,天气(weather)不错";
NSError * error = nil;
NSDataDetector * detector = [NSDataDetector dataDetectorWithTypes:NSTextCheckingTypeLink|NSTextCheckingTypePhoneNumber error:&error];
__block NSUInteger count = 0;
[detector enumerateMatchesInString:string options:0 range:NSMakeRange(0, [string length]) usingBlock:^(NSTextCheckingResult * _Nullable match, NSMatchingFlags flags, BOOL * _Nonnull stop) {
NSLog(@"flag:%lu",(unsigned long)flags);
NSRange matchRange = [match range];
if ([match resultType] == NSTextCheckingTypeLink) {
NSURL *url = [match URL];
NSLog(@"url:%@", url);
}
if (count == 0) *stop = YES;
if ([match resultType] == NSTextCheckingTypePhoneNumber) {
NSString *phoneNumber = [match phoneNumber];
NSLog(@"phoneNumber:%@", phoneNumber);
}
}];