简体   繁体   中英

Replace attributed string into NSMutableAttributedString In Swift 3

I want to output like

My name is Pramod Tapaniya

from below json.

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

I have tried below code, but getting compile time error because I replacing String with Attributed String. I have used SwiftyJson for handle 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

replace with this code

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

Simple solution would be

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: ","))   

}

From 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
    }
}

Please try this :

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)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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