2017-07-06 2 views
1

Ich habe lange Zeichenfolge etwa so: "Q: Was für ein Tag ist es? \ NA: bla bla \ nQ: Wie spät ist es? \ NA: bla bla \ nQ: Was für ein Tag ist es ? \ nA: bla bla \ nQ: Wie spät ist es? \ nA: bla bla \ n "Swift 3 Attributed text solution

Mein Problem ist, dass ich diesen Text in textView zeigen muss, aber die Frage muss orange sein und die Antwort muss lauten graue Farbe. Ich bekomme String vom Server und weiß nicht, was ich bekommen werde, aber das Format wie folgt. Wie löst man dieses Problem?

+0

Der schwierigste Teil ist ein Answsers die genauen Trennzeichen von Fragen zu wissen: 'Q: ... A:' bis '\ n 'und nächsten ? Für den Rest ist es ziemlich geradlinig, sobald Sie die Bereiche kennen. – Larme

+0

Können Sie bitte das Trennzeichen angeben? Und bist du dir sicher, dass du IMMER dieses Format bekommen kannst? –

Antwort

0

Wenn Ihr String Format wie "Q: what day is it?\nA: bla bla\nQ: what time is it?\nA: bla bla\nQ: what day is it?\nA: bla bla\nQ: what time is it?\nA: bla bla\n" ist immer dann können Sie unter Code versuchen:

var str = "Q: what day is it?\nA: bla bla\nQ: what time is it?\nA: bla bla\nQ: what day is it?\nA: bla bla\nQ: what time is it?\nA: bla bla\n" 
let textView = UITextView(frame: CGRect(x: 20.0, y: 90.0, width: 250.0, height: 200.0)) 

    textView.backgroundColor = UIColor.white 

    //separate it with \n 
    let QuestionsAndAnswersArray = str.components(separatedBy: ["\n"]) 

    var finalStringArr = NSMutableAttributedString() 

    for item in QuestionsAndAnswersArray { 

     if item.characters.count > 0 { 

      let firstChar = item[item.startIndex] 

      //For Questions 
      if firstChar == "Q" { 

       //For new line after every character 
       let QuestionStr = item + "\n" 

       var myMutableString = NSMutableAttributedString() 
       myMutableString = NSMutableAttributedString(string: QuestionStr) 
       myMutableString.setAttributes([NSForegroundColorAttributeName : UIColor.red], range: NSRange(location:0,length:item.characters.count)) 
       finalStringArr.append(myMutableString) 

      } else if firstChar == "A" { //For Answers 

       let answerStr = item + "\n" 

       //For new line after every character 
       var myMutableString = NSMutableAttributedString() 
       myMutableString = NSMutableAttributedString(string: answerStr) 
       myMutableString.setAttributes([NSForegroundColorAttributeName : UIColor.gray], range: NSRange(location:0,length:item.characters.count)) 
       finalStringArr.append(myMutableString) 
      } 
     } 
    } 

    textView.attributedText = finalStringArr 

Und Ergebnis wird sein:

enter image description here

Hope this helfen.

0

Das Problem ist, dass es kein "\ n" nach der ersten Frage gibt. Ich habe dies durch ein wenig eine andere Art und Weise gelöst:

let faqStr = "Q: what day is it?A: bla bla\nQ: what time is it?\nA: bla bla\nQ: what day is it?\nA: bla bla\nQ: what time is it?\nA: bla bla\n" 
    var faqStrArray = faqStr.components(separatedBy: "Q:") //separate by Q+A 

    faqStrArray.remove(at: 0) // [0]="" 

    let attrText = NSMutableAttributedString() 
    for i in 0..<faqStrArray.count { 
     faqStrArray[i] = "Q:\(faqStrArray[i])" // append "Q:" that was taken by separator 

     var array = faqStrArray[i].components(separatedBy: "A:") // separate to Question and Answer 
     array[1] = "A:\(array[1])\n" // append "A:" that was taken by separator 

     let attrStringOrange: NSMutableAttributedString = NSMutableAttributedString(string: array[0]) // orange string 
     attrStringOrange.addAttribute(NSForegroundColorAttributeName, value: UIColor.orange, range: NSMakeRange(0, attrStringOrange.length)) // adding attribute 
     let attrStringGrey: NSMutableAttributedString = NSMutableAttributedString(string: array[1]) // grey string 
     attrStringGrey.addAttribute(NSForegroundColorAttributeName, value: UIColor.gray, range: NSMakeRange(0, attrStringGrey.length)) // adding attribute 

     attrStringOrange.append(attrStringGrey) // appending answer to question 

     attrText.append(attrStringOrange) 
    } 

    txtView.attributedText = attrText