TTTAttributedLabel链接正在设置样式但不可点击

时间:2015-07-02 08:34:07

标签: ios swift hyperlink 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")
}

任何人都知道我可能缺少什么?

更新

我发现只是粘贴在一个网址f / e http://example.com变得活跃并且实际上是可点击的,并且didSelectLinkWithUrl变得可点击,尽管我需要一个属性字符串并且它基于HTML字符串。

2 个答案:

答案 0 :(得分:12)

The implementation of setAttributedText:不会更新linkModels数组,而the implementation of setText:会更新text数组。我相信这是导致你的问题的原因。

要解决此问题,请设置标签的attributedText属性,而不是TTTAttributedLabel属性。

The docs也包含此警告:

  

NSString可以显示纯文本和属性文本:只需将NSAttributedStringsetText:传递给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