设置attributedText后,UILabel不会更新

Lin*_*wei 5 uilabel ios swift 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)            
    }
}
Run Code Online (Sandbox Code Playgroud)

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";
})
Run Code Online (Sandbox Code Playgroud)

显示runningDistanceLabeltextattributedText已设置和更改。但是在模拟器中,标签的文本保持不变。

如果我替换:

runningDistanceLabel.attributedText = text
Run Code Online (Sandbox Code Playgroud)

与:

runningDistanceLabel.text = "\(runningDistance)"
Run Code Online (Sandbox Code Playgroud)

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

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

非常感谢你!

编辑:

我确定guard已经通过了,因为它已经在控制台中打印了标签的文本和attributedText,并且添加了一个断点来对其进行测试。

我也尝试:

DispatchQueue.main.async {[unowned self] in
    self.runningDistanceLabel.attributedText = text
}
Run Code Online (Sandbox Code Playgroud)

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

解决方案

Rroobb的帮助下,我在设置标签的attributedText之前添加了一行代码来设置标签的文本:

runningDistanceLabel.text = String(format:"%.2f",runningDistance/1000.0) + "??"
runningDistanceLabel.attributedText = text
Run Code Online (Sandbox Code Playgroud)

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

在iOS文档中有关UILabelattributedText

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

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

但是在这里,我不知道为什么要在设置text之前进行设置attributedText以更新标签的文本。

Rob*_*Rob 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!)
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 在您的帮助下,我只需在设置“attributedText”之前设置“runningDistanceLabel”的文本,它就可以工作了!令人困惑,但令人惊奇! (2认同)
  • 刚刚为此奋斗了半个小时。关键实际上是在“attributedText”之前更新“text”属性,非常感谢! (2认同)