如何在iOS中使用带有Swift的NSAttributedStrings?

时间:2018-01-04 12:06:57

标签: ios swift string uilabel nsattributedstring

我想要一个带有在运行时动态更改的属性字符串的标签。像这样的东西

enter image description here

有没有更好的方法来动态更改价格值而无需对归因键字典进行硬编码并手动构建NSAttributedString

2 个答案:

答案 0 :(得分:3)

在iOS上使用Attributed Strings的最佳方法是在界面构建器中使用内置的Attributed Text编辑器,并避免在源文件中使用不必要的硬编码NSAtrributedStringKeys。

您可以稍后使用此扩展名在运行时动态替换placehoderls:

extension NSAttributedString {
    func replacing(placeholder:String, with valueString:String) -> NSAttributedString {

        if let range = self.string.range(of:placeholder) {
            let nsRange = NSRange(range,in:valueString)
            let mutableText = NSMutableAttributedString(attributedString: self)
            mutableText.replaceCharacters(in: nsRange, with: valueString)
            return mutableText as NSAttributedString
        }
        return self
    }
}

添加一个故事板标签,其属性文字如下所示。

enter image description here

然后,您只需在每次需要时更新值:

label.attributedText = initalAttributedString.replacing(placeholder: "<price>", with: newValue)

确保将原始值保存到initalAttributedString中。

通过阅读本文,您可以更好地理解这种方法: https://medium.com/mobile-appetite/text-attributes-on-ios-the-effortless-approach-ff086588173e

答案 1 :(得分:0)

可能不知道,这是你正在寻找的,但会解决你的问题。

您可以使用每个标签并轻松更新金额,而无需触及属性字符串。

enter image description here

结果如下:

enter image description here

示例代码,我已尝试过此演示:

@IBOutlet weak var lblAmount: UILabel!
func pricelabel() -> Void {
    var amount = 0
    Timer.scheduledTimer(withTimeInterval: 0.3, repeats: true) { (timer) in
        amount += 10
        self.lblAmount.text = "\(amount)"
    }.fire()
}