Search code examples
iosswifthyperlinktttattributedlabel

TTTAttributedLabel links are being styled but not clickable


I've been looking into a solution to getting clickable links working. I can get this working when using UITextView + NSAttributedString but it just doesn't autolayout properly when it's a UITableViewCell.

Now I've added the TTTAttributedLabel to my project and it styles the views just perfectly. The links also turn blue and are underlined.

However clicking them does nothing. I did implement TTTAttributedLabelDelegate on my controller, made the label in the storyboard implement MyLabel (Which just extends TTTAttributedLabel and has the delegate options since I want them to fire inside the same function). For now I've set the controller to be the delegate I was thinking it might not work pointing to itself.

But none of these functions get fired, I got breakpoints and logs in it.

I Implemented didSelectLinkWithUrl and 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")
    }

Outlet

@IBOutlet weak var content: MyLabel!

MyLabel

import UIKit import 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")
}

Anyone know what I could be missing?

Update

I found out that just pasting in an url f/e http://example.com becomes active and is actually clickable and the didSelectLinkWithUrl becomes clickable, allthough I need an attributed string and it's based on a HTML String.


Solution

  • The implementation of setAttributedText: doesn't update the linkModels array, while the implementation of setText: does. I believe this is what causes your issue.

    To resolve, set the label's text property instead of the attributedText property.

    The docs also include this warning:

    TTTAttributedLabel can display both plain and attributed text: just pass an NSString or NSAttributedString to the setText: setter. Never assign to the attributedText property.

    The docs also show this example usage:

    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;