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

时间:2015-02-18 22:39:23

标签: ios objective-c uitextview nsattributedstring

我有一个包含链接和其他文本的UITextView。链接检测已启用并正常工作(iOS8)。但是,我无法在textView中找到链接的范围。

这个想法是扫描文本(在完成链接检测之后)并将链接预加载到Web视图中,这样当用户点击某个元素时,Web视图就可以显示自己。

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

2 个答案:

答案 0 :(得分:2)

如果您的目标是执行Twitter如何在推文中打开链接,请执行以下操作:

  1. UITextView的代理设置为视图控制器。
  2. 在视图控制器中实施UITextViewDelegate方法textView:shouldInteractWithURL:inRange:。当用户在文本视图中选择链接时,将调用此方法。在该方法中,您需要return NO。但是,在返回NO之前,您应该创建一个具有Web视图的新视图控制器,并使用作为参数传入的URL加载Web视图。
  3. 这并不像您提到的那样进行预加载,但我不确定您是否因特定原因(例如您希望Web视图与文本视图一起显示)或者你想这样做只是因为你认为一旦用户点击链接就会有性能优势。

答案 1 :(得分:1)

一种方法是使用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而存在。简而言之,它会从NSDataDetector检测是否有类似:" http://www.randomSite.com"。您可以阅读UITextView以获取有关它的更多信息(它可以检测电话号码,邮件地址等),NSAttributedString通常会在默认情况下检测到一些信息。 因此NSLinkAttributeName可能不包含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]]; }]; 属性。

所以一个解决方法(这次,我只是保留了链接,但我猜你知道怎么做,如果你想要像以前的解决方案那样的范围):

{{1}}