设置attributionText后,UILabel不会更新

时间:2016-10-11 14:44:31

标签: ios swift uilabel swift3

我使用MapKit记录跑步距离。我有以下代码:

var runningDistance : Double = 0{
    didSet{
        guard let text = runningDistanceLabel.attributedText as? NSMutableAttributedString else{return}
        let range = NSMakeRange(0, 4)            
        let attributeString = NSAttributedString(string: String(format:"%.2f",runningDistance/1000.0), attributes: [
            NSFontAttributeName:UIFont(name: "DINCondensed-Bold", size: 17)!       
            ])
        text.replaceCharacters(in: range, with: attributeString)
        runningDistanceLabel.attributedText = text

        print(runningDistanceLabel.text)
        print(runningDistanceLabel.attributedText)            
    }
}

userLocation更新时,我会计算距离并设置runningDistance

在控制台中:

Optional("0.04公里")
Optional(0.04{
    NSFontAttributeName = "Optional(<UICTFont: 0x7ff79b7b7250> font-family: \"DIN Condensed\"; font-weight: bold; font-style: normal; font-size: 17.00pt)";
}公里{
    NSFont = "<UICTFont: 0x7ff79d800110> font-family: \".PingFangSC-Regular\"; font-weight: normal; font-style: normal; font-size: 14.00pt";
NSParagraphStyle = "Alignment 2, LineSpacing 0, ParagraphSpacing 0, ParagraphSpacingBefore 0, HeadIndent 0, TailIndent 0, FirstLineHeadIndent 0, LineHeight 0/0, LineHeightMultiple 0, LineBreakMode 4, Tabs (\n    28L,\n    56L,\n    84L,\n    112L,\n    140L,\n    168L,\n    196L,\n    224L,\n    252L,\n    280L,\n    308L,\n    336L\n), DefaultTabInterval 0, Blocks (\n), Lists (\n), BaseWritingDirection -1, HyphenationFactor 0, TighteningForTruncation NO, HeaderLevel 0";
})

这表明runningDistanceLabel&#39; textattributedText已设置并更改。 但在模拟器中,标签的文字保持不变。

如果我更换:

runningDistanceLabel.attributedText = text

使用:

runningDistanceLabel.text = "\(runningDistance)"

然后在模拟器中,标签的文本可以正常更改。

关于设置attributedText的代码有什么问题?如何设置attributedText并在模拟器中正确更新?

非常感谢!

修改

我确信guard已被传递,因为它已在控制台中打印了标签的文本和来自的textText,并且我添加了一个断点来测试它。

我也试试:

DispatchQueue.main.async {[unowned self] in
    self.runningDistanceLabel.attributedText = text
}

但我仍然无法更新标签的文字。

Soluion

借助 Rroobb 的帮助,我在设置labelText之前添加了一行代码来设置标签的文字:

runningDistanceLabel.text = String(format:"%.2f",runningDistance/1000.0) + "公里"
runningDistanceLabel.attributedText = text

在模拟器中,标签的文字现在可以更新。惊人!

在关于UILabel attributedText

的iOS文档中
  

为此属性分配新值也会使用相同的字符串数据替换text属性的值,尽管没有任何格式信息。

似乎设置attributedText可以自动更改text属性。

但在此,我不知道为什么在设置text之前设置attributedText以更新标签文字。

1 个答案:

答案 0 :(得分:1)

这有效,我添加了两行代码:

 var runningDistance : Double = 0.0 {
    didSet{
        guard let text = runningDistanceLabel.attributedText as? NSMutableAttributedString else{

            return

        }

        let range = NSMakeRange(0, 4)
        runningDistanceLabel.text = String(format:"%.2f",runningDistance/1000.0) //here
        runningDistanceLabel.font = UIFont(name: "DINCondensed-Bold", size: 17) // here
        let attributeString = NSAttributedString(string: String(format:"%.2f",runningDistance/1000.0), attributes: [
            "NSFontAttributeName":UIFont(name: "DINCondensed-Bold", size: 17)!
            ])

        text.replaceCharacters(in: range, with: attributeString)
        runningDistanceLabel.attributedText = text


        print(runningDistanceLabel.text!)
        print(runningDistanceLabel.attributedText!)
    }
}