0

Ich kann nicht glauben, dass ich diese Frage stelle, aber (die Suche nach der Antwort für eine Stunde und eine Hälfte ohne Glück) ... Wie füge ich NSAttributedText an ein UITextView an? (in Swift 2.0+)Append NSAttributed Text zu UITextview

Ich baue ein Tool, das Elemente von meinem Server herunterlädt, und wenn sie hereinkommen, möchte ich AttributedText mit Grün für den Erfolg oder rot für Fehler hinzufügen.

Um dies zu tun, ich glaube, ich NSMutableAttributedString brauchen, aber die UITextView hat NSAttributedString nur die den Zugang zum appendAttributedString(attrString: NSAttributedString NSAttributedString)

nicht so, wenn ich eine UITextView mit einem NSAttributedString auf sie haben, die „Laden“ in rot sagt, wie kann ich anhängen den Text "Laden" mit dem Text in grün "Erfolg".

Zum Beispiel wie folgt aus:

<font color="red">loading</font><font color="green">success</font>

aktualisieren

fand ich eine Antwort auf meine Frage, aber ich fühle mich nicht eine optimale Antwort.

let loadingMessage = NSMutableAttributedString(string: "loading...\n") 
      loadingMessage.addAttribute(NSStrokeColorAttributeName, value: UIColor.redColor(), range: NSRange(location: 0, length: 10)) 

      progressWindowViewController.theTextView.attributedText = loadingMessage 

loadingMessage.appendAttributedString("<font color=\"#008800\">Successfully Synced Stores...</font>\n".attributedStringFromHtml!) 
       progressWindowViewController.theTextView.attributedText = loadingMessage 

Meine Antwort oben funktioniert, aber nicht so durch den gesamten Text überschrieben wird (und es wird jede Zeit zieht dies auch weiterhin tun). Ich frage mich, ob es eine echte Möglichkeit gibt, die Zeichenfolge an das Ende für eine optimale Leistung anzuhängen?

Die Erweiterung I für HTML verwendet

extension String { 

    var attributedStringFromHtml: NSAttributedString? { 
     do { 
      return try NSAttributedString(data: self.dataUsingEncoding(NSUTF8StringEncoding)!, options: [NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType], documentAttributes: nil) 
     } catch _ { 
      print("Cannot create attributed String") 
     } 
     return nil 
    } 
} 

Antwort

3

Sie eine NSAttributedString zu einem NSMutableAttributedStringmutableCopy() mit umwandeln kann, und copy() wird für Sie das Gegenteil tun, etwa so:

let string1 = NSAttributedString(string: "loading", attributes: [NSForegroundColorAttributeName: UIColor.redColor()]) 
let string2 = NSAttributedString(string: "success", attributes: [NSForegroundColorAttributeName: UIColor.greenColor()]) 

let newMutableString = string1.mutableCopy() as! NSMutableAttributedString 
newMutableString.appendAttributedString(string2) 

textView.attributedText = newMutableString.copy() as! NSAttributedString 

Es ist nur ein wenig peinlich, da sowohl mutableCopy() als auch copy()AnyObject zurückgeben, also müssen Sie wandle sie unter Verwendung von as! ständig in den richtigen Typ um.

+0

Ihre Methode ist wirklich interessant, ich habe meine Frage mit einer anderen Lösung aktualisiert, die ich gefunden habe, ist Ihre besser? Wie wenn ich Zeichenfolgen anhange, nachdem ich es auf die textView gesetzt habe, hängt es an oder muss ich die Zeichenkette auf dem textView zurücksetzen? –

+1

Ich möchte nicht beurteilen, welche Methode effektiver ist, es hängt sicherlich vom Kontext ab. Aber leistungsmäßig würde ich vermuten, dass 'mutableCopy()' und 'copy()' ziemlich schnell sind. Leider können Sie das UITextViews.attributedText-Objekt nicht "live anhängen", da dies ein unveränderliches Objekt ist. (Da "NSMutableAttributedString" eine Unterklasse von "NSAttributedString" ist, können Sie der UITextView eine veränderbare Zeichenfolge zuweisen."AppendAttributedString()" aufzurufen, funktioniert hier jedoch nicht - es scheint, als ob UITextView eine interne Konvertierung durchführt. – Lasse

+1

Ihre Antwort half, der einzige Unterschied war, dass ich die Strings als NSMutableAttributedString definierte, um die Konvertierungen zu vermeiden. Unglücklicherweise hat UITextview keine interne Methode, um korrekt anzuhängen. –

1
let loadingMessage = NSMutableAttributedString(string: "loading...") 
    loadingMessage.addAttribute(NSStrokeColorAttributeName, value: UIColor.redColor(), range: NSRange(location: 0, length: 10)) 

    let textView = UITextView() 
    textView.attributedText = loadingMessage 
+0

Dies hängt jedoch nicht das Wort Erfolg an? Das ist der Schlüssel zu dieser Frage. Dies zeigt nur, wie man den Text in einem Bereich rot macht, den ich bereits kenne. Bedenken Sie auch, dass ich weiß, wie man normalen Text anhängen kann, aber in diesem Fall fügen wir einen "grünen" Text hinzu, der Erfolg sagt. Dies ist der schwierige Teil, um herauszufinden. –