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