2017-08-28 22 views
0

我要输出像替换属性串入NSMutableAttributedString在斯威夫特3

我的名字是普拉莫德 Tapaniya

从下面的JSON。

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

我已经试过下面的代码,但由于我用属性字符串替换了字符串而导致编译时错误。我用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 

回答

0

与此代码替换

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 
0

简单的解决办法是

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

请试试这个:

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) 
+0

“Pramod”粗体。你只需要替换字符串。 –

+0

更新了答案。 –