在UITextView中获取链接的文本范围

我有一个UITextView包含一个链接和一些其他的文字。 链接检测已启用并正在运行(iOS8)。 但是,我在findtextView内的链接范围的损失。

这个想法是,文本被扫描(链接检测完成后)和链接预加载到一个Web视图,以便当用户点击一个元素的地方,networking视图可以显示自己。

如何获取UITextView中检测到的链接的范围?

一种方法是使用enumerateAttribute:inRange:options:usingBlock:从我的示例attr中的[yourTextView attributedText]

 __block NSMutableDictionary *ranges = [[NSMutableDictionary alloc] init]; [attr enumerateAttribute:NSLinkAttributeName inRange:NSMakeRange(0, [attr length]) options:0 usingBlock:^(id value, NSRange range, BOOL *stop) { NSLog(@"Attribute: %@, %@", value, NSStringFromRange(range)); if (value) [ranges setObject:value forKey:[NSValue valueWithRange:range]]; }]; NSLog(@"Ranges: %@", ranges); 

我保持范围,以防万一,但你可以使用NSArray所有不同的链接,而不是一个NSDictionary

编辑:
从您的意见,我可能会认为你提到的链接是因为NSDataDetector 。 简而言之,它将从NSString检测是否有类似“ http://www.randomSite.com ”的内容。 你可以阅读有关NSDataDetector更多信息(它可以检测电话号码,邮件地址等), UITextView通常会默认检测一些。 所以NSAttributedString可能不包含NSLinkAttributeName属性。

所以一个解决方法(这次,我只是保持链接,但我想你知道该怎么做,如果你想像范围以前的解决scheme的东西):

 NSString *stringWithNSDataDetector = [yourTextView text]; NSError *error = nil; NSDataDetector * dataDetector = [NSDataDetector dataDetectorWithTypes:NSTextCheckingTypeLink error:&error]; //Check if (error) before __block NSMutableArray *allMatches = [[NSMutableArray alloc] init]; [dataDetector enumerateMatchesInString:stringWithNSDataDetector options:0 range:NSMakeRange(0, [stringWithNSDataDetector length]) usingBlock:^(NSTextCheckingResult *match, NSMatchingFlags flags, BOOL *stop) { if ([match resultType] == NSTextCheckingTypeLink) [allMatches addObject:[match URL]]; }]; 

如果您打算做一些类似于Twitter在Twitter中打开链接的内容,请执行以下操作:

  1. 将您的UITextView设置为您的视图控制器。
  2. 在视图控制器中实现UITextViewDelegate方法textView:shouldInteractWithURL:inRange: 当用户在文本视图中select链接时,这将被调用。 在该方法中,您将要return NO 。 但是,在返回NO之前,您应该创build一个具有Web视图的新视图控制器,并使用传入的URL作为参数加载Web视图。

这不会像你所提到的那样进行预加载,但是我不确定是否出于某个特定的原因(比如你希望Web视图显示在文本视图旁边),还是仅仅因为你一旦用户点击链接,就会有性能优势。