TTTAttributedLabel ссылки стилизуются, но не кликабельны

Я искал решение, чтобы заставить работать кликабельные ссылки. Я могу заставить это работать при использовании UITextView + NSAttributedString, но он просто не выполняет правильное автоматическое расположение, когда это UITableViewCell.

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

Однако нажатие на них ничего не делает. Я реализовал TTTAttributedLabelDelegate на своем контроллере, сделал метку в раскадровке реализовать MyLabel (которая просто расширяет TTTAttributedLabel и имеет параметры делегата, так как я хочу, чтобы они запускались внутри одной и той же функции). Пока я установил контроллер в качестве делегата, я думал, что он может не работать, указывая на себя.

Но ни одна из этих функций не запускается, у меня есть точки останова и логины.

Я реализовал didSelectLinkWithUrl и didLongPressLinkWithUrl.

 func attributedLabel(label: TTTAttributedLabel!, didSelectLinkWithURL url: NSURL!) {
        Debug.log("link clicked")
    }
    func attributedLabel(label: TTTAttributedLabel!, didLongPressLinkWithURL url: NSURL!, atPoint point: CGPoint) {
        Debug.log("link long clicked")
    }

Выход

@IBOutlet weak var content: MyLabel!

MyLabel

импорт UIKit импорт TTTAttributedLabel

class MyLabel : TTTAttributedLabel, TTTAttributedLabelDelegate {

override func didMoveToSuperview() {
    if (self.delegate == nil) {
        self.delegate = self
    }
    self.enabledTextCheckingTypes = NSTextCheckingType.Link.rawValue
    self.userInteractionEnabled = true
}

func attributedLabel(label: TTTAttributedLabel!, didSelectLinkWithURL url: NSURL!) {
    Debug.log("link clicked")
}
func attributedLabel(label: TTTAttributedLabel!, didLongPressLinkWithURL url: NSURL!, atPoint point: CGPoint) {
    Debug.log("link long clicked")
}

Кто-нибудь знает, чего мне не хватает?

Обновить

Я обнаружил, что просто вставка в URL-адресе f / e http://example.com/ становится активной, и на нее можно кликнуть, а didSelectLinkWithUrl становится кликабельной, хотя мне нужна приписанная строка, и она основана на строке HTML.

2 ответа

Решение

Реализация setAttributedText: не обновляет linkModels массив, в то время как реализация setText: делает. Я верю, что это то, что вызывает вашу проблему.

Чтобы решить, установите ярлык text собственность вместо attributedText имущество.

Документы также включают это предупреждение:

TTTAttributedLabel может отображать как простой, так и атрибутивный текст: просто передайте NSString или же NSAttributedString к setText: сеттер. Никогда не назначать на attributedText имущество.

Документы также показывают этот пример использования:

TTTAttributedLabel *attributedLabel = [[TTTAttributedLabel alloc] initWithFrame:CGRectZero];

NSAttributedString *attString = [[NSAttributedString alloc] initWithString:@"Tom Bombadil"
                                                                attributes:@{
        (id)kCTForegroundColorAttributeName : (id)[UIColor redColor].CGColor,
        NSFontAttributeName : [UIFont boldSystemFontOfSize:16],
        NSKernAttributeName : [NSNull null],
        (id)kTTTBackgroundFillColorAttributeName : (id)[UIColor greenColor].CGColor
}];

// The attributed string is directly set, without inheriting any other text
// properties of the label.
attributedLabel.text = attString;

Аарон Брагер прав! Раньше у меня была такая же проблема, но я исправил ее в Swift, заменив строку:

label.attributedText = attributedString

с линией:

label.setText(attributedString)

Это принимается компилятором, потому что метод setText принимает AnyObject. Я также увеличил шрифт атрибутивной строки ссылки, чтобы он захватывал мой сигнал, и теперь он работает! Я использовал это для ссылки усечения, это целая часть:

label.lineBreakMode = .ByTruncatingHead
label.attributedTruncationToken = NSMutableAttributedString(string: "... Show more", attributes: [NSForegroundColorAttributeName: UIColor.cueCyan(), NSLinkAttributeName: readMoreLink, NSFontAttributeName: UIFont.formFont(.Light, size: fontSize+24)!])
label.userInteractionEnabled = true
label.delegate = self
Другие вопросы по тегам