I use MapKit to record running distance. I have the following code:
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)
}
}
When userLocation
update, I calculate the distance and set runningDistance
.
In console:
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";
})
That shows the runningDistanceLabel
's text
and attributedText
has been set and changed. But in simulator, the label's text remains unchanged.
And if I replace:
runningDistanceLabel.attributedText = text
with:
runningDistanceLabel.text = "\(runningDistance)"
Then in simulator, the label's text can be changed normally.
What's wrong with my code about setting attributedText? How to set attributedText
and update correctly in simulator?
Thank you very much!
Edit:
I am sure the guard
has been passed because it has printed label's text and attributedText in console and I have added a breakpoint to test it.
I also try:
DispatchQueue.main.async {[unowned self] in
self.runningDistanceLabel.attributedText = text
}
But I still cannot update the label's text.
Soluion
And with Rroobb's help, I add a line of code to set label's text before setting its attributedText:
runningDistanceLabel.text = String(format:"%.2f",runningDistance/1000.0) + "公里"
runningDistanceLabel.attributedText = text
And in simulator, the label's text can be updated now. Amazing!
In iOS document about UILabel
's attributedText
:
Assigning a new value to this property also replaces the value of the text property with the same string data, albeit without any formatting information.
It seems that setting attributedText
can automatically change the text
property.
But here I don't know why I should set text
before setting attributedText
in order to update the label's text.
This works, I added two line of code :
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!)
}
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With