UILabel - строка в виде текста и ссылок - PullRequest
71 голосов
/ 12 января 2012

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

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

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

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

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

Ответы [ 6 ]

130 голосов
/ 19 января 2012

Вы можете добавить настраиваемые действия к любой из доступных 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 . Он поддерживает пользовательские ссылки из коробки.

18 голосов
/ 20 января 2012

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

9 голосов
/ 18 января 2012

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

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

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

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

6 голосов
/ 17 января 2012

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

Существует также гораздо более простое решение, если все ваши ссылки являются телефонами \ адресами \ URL-адресами. Вы можете просто использовать UITextView вместо UILabel. Имеет автоопределение телефонов, адреса и т. Д. (Просто установите флажки в IB)

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

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

3 голосов
/ 16 апреля 2015

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

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

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

https://github.com/TomSwift/TSLabel

3 голосов
/ 12 января 2012

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

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];
...