Подтвердить что ты не робот

UILabel - строка как текст и ссылки

У меня есть UILabel, текст которого я получаю с сервера. Некоторые тексты должны быть идентифицированы как ссылки, и при прикосновении к этим ссылкам необходимо выполнить некоторые действия. например

NSString * str = @ "Мой номер телефона 645-345-2345, и мой адрес xyz";

Это полный текст для UILabel. У меня есть только один UILabel для отображения этого текста (текст динамический. Я просто привел пример.). При нажатии этих ссылок мне нужно выполнить такие действия, как переход на другой экран или вызов.
Я знаю, что я могу отображать такой текст с помощью OHAttributedLabel. И ссылки могут отображаться следующим образом:

[label1 addCustomLink:[NSURL URLWithString:@"http://www.foodreporter.net"] inRange:[txt rangeOfString:someString]];  

Но мне интересно, как я могу заставить эти текстовые ссылки выполнять некоторые действия, такие как навигация на другой экран или вызов.
Позвольте мне знать, требуется ли больше объяснений.

4b9b3361

Ответ 1

Вы можете добавить пользовательские действия к любой из доступных заменяемых UILabel замен, которые поддерживают ссылки, используя фальшивую схему URL, которую вы перехватите позже:

TTTAttributedLabel *tttLabel = <# create the label here #>;
NSString *labelText = @"Lost? Learn more.";
tttLabel.text = labelText;
NSRange r = [labelText rangeOfString:@"Learn more"]; 
[tttLabel addLinkToURL:[NSURL URLWithString:@"action://show-help"] withRange:r];

Затем в TTTAttributedLabelDelegate:

- (void)attributedLabel:(TTTAttributedLabel *)label didSelectLinkWithURL:(NSURL *)url {
    if ([[url scheme] hasPrefix:@"action"]) {
        if ([[url host] hasPrefix:@"show-help"]) {
            /* load help screen */
        } else if ([[url host] hasPrefix:@"show-settings"]) {
            /* load settings screen */
        }
    } else {
        /* deal with http links here */
    }
}

TTTAttributedLabel является вилкой OHAttributedLabel.

Если вы хотите более сложный подход, посмотрите Nimbus Attributed Label. Он поддерживает пользовательские ссылки из коробки.

Ответ 2

Вы можете использовать UITextView с номерами телефонов и обнаружением ссылок ДА, прокрутка отключена Да, пользовательское взаимодействие включено ДА, а не UILabel.

Ответ 3

Мой проект успешно использовал OHAttributedLabel для этого. Проверьте

-(BOOL)attributedLabel:(OHAttributedLabel*)attributedLabel shouldFollowLink:(NSTextCheckingResult*)linkInfo;

в OHAttributedLabelDelegate (ссылка). Это позволяет вам решать, что происходит при нажатии ссылки. Если вы посмотрите на источник пример из проекта OHAttributedLabel, он использовал для отображения предупреждения. Если вы вернули NO в этом случае (чтобы и действие по умолчанию не происходило), вы можете просто делать все, что хотите, например, навигация и т.д.

Обратите внимание, что это требует, чтобы вы могли правильно определить действие непосредственно из текста. Для нашего проекта мы использовали немного более благоприятное решение, где сервер отправил нам текст с тегами в них и список команд для каждого тега.

Ответ 4

Там есть проект под названием FancyLabel, который касается того, что вам нужно. Возможно, это потребует некоторой настройки. Кроме того, я думаю, что Three20 имеет эту функцию, но это может быть перебор, если вы еще не используете его.

Там также гораздо более простое решение, если все ваши ссылки - телефоны \addresses\urls. Вы можете просто использовать UITextView вместо UILabel. Он имеет автоматическое обнаружение телефонов, адресов и т.д. (Просто установите флажки в IB)

Вы также можете создавать пользовательские действия в ответ на события кликов по этим ссылкам, переопределяя openURL, как описано здесь

Есть ли конкретная причина, по которой вы должны использовать UILabel вместо UITextView? Обратите внимание, что многие реализации атрибутивных меток наследуются от UIView или не реализуют все функциональные возможности UILabel.

Ответ 5

Вы можете использовать настраиваемую кнопку, чтобы дать ссылку на ссылку. Также вы можете добавить жест на пользовательский ярлык, если вы не хотите использовать кнопку.

UITapGestureRecognizer* gesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(userTappedOnLink:)];
// if labelView is not set userInteractionEnabled, you must do so
[labelView setUserInteractionEnabled:YES];
[labelView addGestureRecognizer:gesture];

Ответ 6

Я не поклонник принуждения использовать UITextView или стороннюю библиотеку, когда все, что мне нужно, - это легкий ярлык, который отображает ссылки (и это говорит мне, когда они прослушиваются!)

Здесь моя попытка легкого подкласса UILabel, способного обнаруживать ссылки. Этот подход отличается от других, которые я видел в том, что он получает доступ к UILabel shared NSLayoutManager через обратный вызов делегата, добавленный в NSTextStorage через расширение категории. Красота заключается в том, что UILabel выполняет свой собственный макет и чертеж - другие замены UILabel часто дополняют или заменяют собственное поведение дополнительным NSLayoutManager/NSTextContainer.

Вероятно, App Store безопасен, но несколько хрупким - используйте на свой страх и риск!

https://github.com/TomSwift/TSLabel

Ответ 7

Если вы не хотите вводить новую зависимость, можно настроить стандартный UILabel для отображения ссылок и выполнения пользовательских действий для них. Проверьте этот ответ на мой вопрос.