繁体   English   中英

在Swift 3中将属性字符串替换为NSMutableAttributedString

[英]Replace attributed string into NSMutableAttributedString In Swift 3

我想输出像

我叫Pramod Tapaniya

从json下面。

{
    "text": "My name is B0$ Tapaniya.",
    "formats": {
            "formatId": [
                "B0$"
            ],
            "formatValue": [
                "Pramod"
            ]
    }
}

我尝试了下面的代码,但由于我将String替换为Attributed String,因此出现了编译时错误。 我已经使用SwiftyJson处理json。

let boldAttributes = [NSForegroundColorAttributeName: UIColor.white, NSFontAttributeName: UIFont.boldSystemFont(ofSize: 13)]
let simpleAttributes = [NSForegroundColorAttributeName: UIColor.lightGray, NSFontAttributeName: UIFont.systemFont(ofSize: 13)]

let strComm = NSMutableAttributedString(string: dict["text"].stringValue, attributes: simpleAttributes)
let attributedStr = NSMutableAttributedString()

attributedStr.append(strComm)

let arrFormatId = dict["formats"]["formatId"]
let arrFormatValue = dict["formats"]["formatValue"]

for var i in 0..<arrFormatId.count{
    let strBold = NSMutableAttributedString(string: arrFormatValue[i].stringValue, attributes: boldAttributes)
    attributedStr.mutableString.replaceOccurrences(of: arrFormatId[i].stringValue, with: strBold, options: .caseInsensitive, range: NSRange(location: 0, length: attributedStr.length)) //Cannot convert value of type 'NSMutableAttributedString' to expected argument type 'String'
}
return attributedStr

用此代码替换

let boldAttributes = [NSForegroundColorAttributeName: UIColor.white, NSFontAttributeName: UIFont.boldSystemFont(ofSize: 13)]
let simpleAttributes = [NSForegroundColorAttributeName: UIColor.lightGray, NSFontAttributeName: UIFont.systemFont(ofSize: 13)]

let strComm = NSMutableAttributedString(string: dict["text"].stringValue, attributes: simpleAttributes)
let attributedStr = NSMutableAttributedString()

attributedStr.append(strComm)

let arrFormatId = dict["formats"]["formatId"]
let arrFormatValue = dict["formats"]["formatValue"]

for var i in 0..<arrFormatId.count{
    let strBold = NSMutableAttributedString(string: arrFormatValue[i].stringValue, attributes: boldAttributes)
    while attributedStr.mutableString.contains(arrFormatId[i].stringValue) {
        let range = attributedStr.mutableString.range(of: arrFormatId[i].stringValue)
        attributedStr.replaceCharacters(in: range, with: strBold)
    }
}
return attributedStr

简单的解决方案是

var text = "My name is B0$ Tapaniya"
var arrayID = ["B0$"]

var arrayValue =  ["Pramod"]

if arrayID.count == arrayValue.count {
    for key in arrayID {
        text = text.replacingOccurrences(of: key, with:arrayValue[arrayID.index(of: key)!])
    }

 // Now use below methods

    let formattedString = NSMutableAttributedString()
    formattedString
   .normal(text)
   .bold(arrayValue.joined(separator: ","))   

}

https://stackoverflow.com/a/37992022/4601900

extension NSMutableAttributedString {
    @discardableResult func bold(_ text:String) -> NSMutableAttributedString {
        let attrs = [NSForegroundColorAttributeName: UIColor.white, NSFontAttributeName: UIFont.boldSystemFont(ofSize: 13)]

        let boldString = NSMutableAttributedString(string:"\(text)", attributes:attrs)
        self.append(boldString)
        return self
    }

    @discardableResult func normal(_ text:String)->NSMutableAttributedString {
        let normal =  NSAttributedString(string: text)
        self.append(normal)
        return self
    }
}

请尝试这个:

var testDict = ["text": "My name is B0$ Tapaniya.","formats": ["formatId": ["B0$"],"formatValue": ["Pramod"]]] as [String : AnyObject]
let attrString = NSMutableAttributedString(string: testDict["text"] as! String)
var formatIDS = testDict["formats"]?.value(forKey: "formatId") as! [String]
var formatValues = testDict["formats"]?.value(forKey: "formatValue") as! [String]

for i in 0..<formatIDS.count {
    attrString.mutableString.replaceOccurrences(of: formatIDS[i], with: formatValues[i], options: NSString.CompareOptions.caseInsensitive, range: NSRange(location: 0, length: attrString.length))
    attrString.addAttributes([NSFontAttributeName: UIFont.boldSystemFont(ofSize: 12.0)], range: attrString.mutableString.range(of: formatValues[i] as String))
}
print(attrString)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM