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)
显示runningDistanceLabel的text和attributedText已设置和更改。但是在模拟器中,标签的文本保持不变。
如果我替换:
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文档中有关UILabel的attributedText:
为该属性分配新值还将用相同的字符串数据替换text属性的值,尽管没有任何格式信息。
似乎设置attributedText可以自动更改text属性。
但是在这里,我不知道为什么要在设置text之前进行设置attributedText以更新标签的文本。
这有效,我添加了两行代码:
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)
| 归档时间: |
|
| 查看次数: |
1512 次 |
| 最近记录: |