我有一个包含链接和其他文本的UITextView。链接检测已启用并正常工作(iOS8)。但是,我无法在textView中找到链接的范围。
这个想法是扫描文本(在完成链接检测之后)并将链接预加载到Web视图中,这样当用户点击某个元素时,Web视图就可以显示自己。
如何在UITextView中获取检测到的链接范围?
答案 0 :(得分:2)
如果您的目标是执行Twitter如何在推文中打开链接,请执行以下操作:
UITextView
的代理设置为视图控制器。UITextViewDelegate
方法textView:shouldInteractWithURL:inRange:
。当用户在文本视图中选择链接时,将调用此方法。在该方法中,您需要return NO
。但是,在返回NO之前,您应该创建一个具有Web视图的新视图控制器,并使用作为参数传入的URL加载Web视图。这并不像您提到的那样进行预加载,但我不确定您是否因特定原因(例如您希望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}}