我一直在研究让可点击链接正常工作的解决方案。我可以在使用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")
}
任何人都知道我可能缺少什么?
更新
我发现只是粘贴在一个网址f / e http://example.com变得活跃并且实际上是可点击的,并且didSelectLinkWithUrl变得可点击,尽管我需要一个属性字符串并且它基于HTML字符串。
答案 0 :(得分:12)
The implementation of setAttributedText:
不会更新linkModels
数组,而the implementation of setText:
会更新text
数组。我相信这是导致你的问题的原因。
要解决此问题,请设置标签的attributedText
属性,而不是TTTAttributedLabel
属性。
The docs也包含此警告:
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;
媒体资源。
文档还显示了此示例用法:
{
"to" : "APA91bHun4MxP5egoKMwt2KZFBaFUH-1RYqx...",
"data" : {
//pass the flag here along with message
...
},
}
答案 1 :(得分:2)
Aaron Brager是对的! 我曾经遇到过同样的问题,但我在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