簡體   English   中英

設置attributedText后,UILabel不會更新

[英]UILabel doesn't update after setting attributedText

我使用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";
})

這表明runningDistanceLabeltextattributedText已被設置和更改。 但在模擬器中,標簽的文本保持不變。

如果我更換:

runningDistanceLabel.attributedText = text

有:

runningDistanceLabel.text = "\(runningDistance)"

然后在模擬器中,標簽的文本可以正常更改。

關於設置attributedText的代碼有什么問題? 如何在模擬器中正確設置attributedText並更新?

非常感謝你!

編輯:

我確信已經通過了guard因為它已經在控制台中打印了標簽的文本和來源,我添加了一個斷點來測試它。

我也嘗試:

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

但我仍然無法更新標簽的文字。

Soluion

Rroobb的幫助下,我在設置tagsText之前添加了一行代碼來設置標簽的文本:

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

在模擬器中,標簽的文本現在可以更新。 驚人!

在關於UILabelattributedText iOS文檔中:

為此屬性分配新值也會使用相同的字符串數據替換text屬性的值,盡管沒有任何格式信息。

似乎設置attributedText可以自動更改text屬性。

但在這里我不知道為什么我應該在設置attributedText之前設置text以更新標簽的文本。

這有效,我添加了兩行代碼:

 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!)
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM