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.