I'm having problems setting up the TTTAttributedLabel within my project.
I have set the protocol delegate in my header file
@interface TwitterFeedControlleriPad : UIViewController <TTTAttributedLabelDelegate, UICollectionViewDataSource, UICollectionViewDelegate, UICollectionViewDelegateWaterfallLayout>
I have set the ViewController to it (is not nil, I checked already).
cell.tweetLabel.delegate = self;
It's showing all the links right in the label but when I tap them it's not calling the function.
- (void)attributedLabel:(TTTAttributedLabel *)label didSelectLinkWithURL:(NSURL *)url
I've already used it before with success and it's exactly the same code!! It's driving me crazy!
I understand it is not your case, but this is for everyone who have the same problem as I had and stumble on this thread.
I had an UITapGestureRecognizer
on the same view as the TTTAttributedLabel
. Because of the first one, the 'touchEnded
' function of the TTTAttributedLabel
wasn't called, which is responsible for handling clicked links.
I solved the problem by adding the line: tapGestureRecognizer.cancelsTouchesInView = NO;
Solved! The problem was the "User Interaction Enabled" Checkbox in the CollectionViewCell... It was disabled! it took me 4 hours to figured it out!! Thank you anyway!
The UILabel
userInteractionEnabled
seems to be disabled by default, so unless you explicitly enable it, it won't work. That was my problem.
One possible cause for the same problem (similar to Joeran's answer) is if you have a custom UITapGestureRecognizer
on the view that keeps the TTTAttributedLabel
's tap gesture from being called. In my case I needed to block the tap gesture's action from being called if the tap was on a link, so cancelsTouchesInView
was not enough.
My solution: blocking the tap gesture from being recognized at all.
In viewDidLoad
:
tapGesture.delegate = self
And below the actual implementation of my class:
extension MyView: UIGestureRecognizerDelegate {
override func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
if gestureRecognizer == self.tapGesture {
let view = gestureRecognizer.view
let location = gestureRecognizer.location(in: view)
let subview = view?.hitTest(location, with: nil)
// test if the tap was in a TTTAttributedLabel AND on a link
if let ttt = subview as? TTTAttributedLabel, ttt.link(at: gestureRecognizer.location(in: ttt)) != nil {
return false
}
}
//else
return true
}
}