NSDataDetector只是知道這個類的人甚少辛蚊。 NSDataDetector它是繼承至NSRegularExpression的,也就是我們所說的正則表達式求妹。NSDataDetector的使用很簡單揩懒,有一個類方法和一個實例方法止吁。
+ (nullable NSDataDetector *)dataDetectorWithTypes:(NSTextCheckingTypes)checkingTypes error:(NSError **)error;
- (nullable instancetype)initWithTypes:(NSTextCheckingTypes)checkingTypes error:(NSError **)error NS_DESIGNATED_INITIALIZER;
這里的type就是我們需要匹配的類型。這些 type 都是系統(tǒng)幫我們定義好的燎悍,當(dāng)然我們也可以自己自定義type敬惦。
typedef NS_OPTIONS(uint64_t, NSTextCheckingType) { // a single type NSTextCheckingTypeOrthography = 1ULL << 0, // language identification
NSTextCheckingTypeSpelling = 1ULL << 1, // spell checking
NSTextCheckingTypeGrammar = 1ULL << 2, // grammar checking
NSTextCheckingTypeDate = 1ULL << 3, // date/time detection
NSTextCheckingTypeAddress = 1ULL << 4, // address detection
NSTextCheckingTypeLink = 1ULL << 5, // link detection
NSTextCheckingTypeQuote = 1ULL << 6, // smart quotes
NSTextCheckingTypeDash = 1ULL << 7, // smart dashes
NSTextCheckingTypeReplacement = 1ULL << 8, // fixed replacements, such as copyright symbol for (c)
NSTextCheckingTypeCorrection = 1ULL << 9, // autocorrection
NSTextCheckingTypeRegularExpression NS_ENUM_AVAILABLE(10_7, 4_0) = 1ULL << 10, // regular expression matches
NSTextCheckingTypePhoneNumber NS_ENUM_AVAILABLE(10_7, 4_0) = 1ULL << 11, // phone number detection
NSTextCheckingTypeTransitInformation NS_ENUM_AVAILABLE(10_7, 4_0) = 1ULL << 12 // transit (e.g. flight) info detection};
這僅僅是第一步,這一步就好比我們寫好了正則表達式谈山,那么下一步就是將它運用在字符串中進行匹配俄删。這里有5種方法可共選擇
//1.檢測然后對每個檢測到的數(shù)據(jù)進行操作
- (void)enumerateMatchesInString:(NSString *)string options:(NSMatchingOptions)options range:(NSRange)range usingBlock:(void (^)(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop))block;
//2.檢測獲得檢測得到的數(shù)組
- (NSArray *)matchesInString:(NSString *)string options:(NSMatchingOptions)options range:(NSRange)range;
//3.獲得檢測得到的總數(shù)
- (NSUInteger)numberOfMatchesInString:(NSString *)string options:(NSMatchingOptions)options range:(NSRange)range;
//4.第一個檢測到的數(shù)據(jù)
- (NSTextCheckingResult *)firstMatchInString:(NSString *)string options:(NSMatchingOptions)options range:(NSRange)range;
//5.第一檢測到的數(shù)據(jù)的Range
- (NSRange)rangeOfFirstMatchInString:(NSString *)string options:(NSMatchingOptions)options range:(NSRange)range;
匹配到了對應(yīng)的字符串并知道了字符串對應(yīng)所在的NSRange,接下來就可以利用NSMutableAttributedString來讓這些字符串高亮奏路。
高亮文本的事件響應(yīng)
UITextView
在UITextView中可以直接響應(yīng)高亮文本的事件畴椰,先設(shè)置 UITextView 的delegate,并實現(xiàn)
-
(BOOL)textView:(UITextView *)textView shouldInteractWithURL:(NSURL *)URL inRange:(NSRange)characterRange協(xié)議鸽粉。此時要設(shè)置 UITextView 的editable為NO斜脂,不然不會走回調(diào)的API。
做完這些之后還需要設(shè)置文本響應(yīng)的 range触机,根據(jù)上面獲取到的文本和 range帚戳,我們可以根據(jù)屬性字符串的
(void)addAttribute:(NSString *)name value:(id)value range:(NSRange)range;方法設(shè)置響應(yīng)事件,name為NSLinkAttributeName儡首,value為響應(yīng)事件接收到的 value片任,range為需要響應(yīng)事件的 range。
UILabel
其實在 Label 中實現(xiàn)文本高亮并實現(xiàn)事件的響應(yīng)椒舵,在 Github 上面有很多庫了蚂踊,例如YYText中的 YYLabel、TTTAttributedLabel等等笔宿,太多了就不一一列舉了犁钟,但是在YYLabel
中同時實現(xiàn)長按事件和點擊事件的時候,響應(yīng)長按事件之后還會響應(yīng)點擊事件泼橘,這時候就需要我們自己手動處理一下了涝动。