Способ сделать это, использовать enumerateAttribute:inRange:options:usingBlock:
, где из моего примера attr
is [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
.
EDIT:
Из ваших комментариев, я могу предположить, что ссылка, которую вы упомянули там из-за NSDataDetector
. В нескольких словах он обнаружит от NSString
, если есть что-то вроде: «http://www.randomSite.com». Вы можете прочитать о NSDataDetector
, чтобы получить дополнительную информацию об этом (он может определять номера телефонов, почтовые адреса и т. Д.), 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]];
}];
Есть ли конкретная причина вы хотите предварительно загрузить его? – AdamPro13
Как вы поместили ссылку в 'NSAttributedString'? Вы можете перечислить атрибуты вашего 'NSAttributedString' и найти тот, у которого есть' NSLinkAttributeName'. Но вы ищете его диапазон или URL-адрес ссылки за ним? – Larme
@ AdamPro13 Чтобы уменьшить задержку при открытии ее локально, вместо открытия сафари и просмотра там. @ Larme Ссылка была автоматически обнаружена UITextView, я не создал атрибутированную строку. Есть ли способ, которым я могу ретроактивно перечислить атрибутированную строку? –