在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中打开链接的内容,请执行以下操作:
- 将您的
UITextView
设置为您的视图控制器。 - 在视图控制器中实现
UITextViewDelegate
方法textView:shouldInteractWithURL:inRange:
当用户在文本视图中select链接时,这将被调用。 在该方法中,您将要return NO
。 但是,在返回NO之前,您应该创build一个具有Web视图的新视图控制器,并使用传入的URL作为参数加载Web视图。
这不会像你所提到的那样进行预加载,但是我不确定是否出于某个特定的原因(比如你希望Web视图显示在文本视图旁边),还是仅仅因为你一旦用户点击链接,就会有性能优势。