Erstellen Sie in swift für iOS @ eine zugeordnete Zeichenfolge aus einfachem (Android-formatiertem) Tex

Ich lese Strings aus einer Localizable.strings, die so etwas wie das enthält, was Sie im Grunde in einer strings.xml einer Android-App haben.

"testShort" = "A <b>short</b>\ntest with another<b>bold text</b>";

Der Fettdruck und der Zeilenvorschub sind die einzigen Formatierungsattribute, die ich in meinen Texten habe. Ich versuche seit Tagen erfolglos, eine solche Methode zu entwickeln:

func ConvertText(inputText: String) -> NSAttributedString {
    // here comes the conversion to a representation with Helvetica 14pt and Helvetica-Bold 14pt including line feeds.
}

Mein letztes Ziel ist es, den Text in attributedText einer UITextView anzuzeigen.

Swift und iOS sind ein bisschen neu, ohne dass ich Objective-C kenne. Ich fand es sehr schwierig, String-Manipulationen durchzuführen, da sie sehr unterschiedlich und komplex sind und alle Beispiele in Objective-C enthalten sind. Was es noch schwieriger macht, ist, dass die meisten API-Methoden in Swift nicht verfügbar sind oder sich von denen in Objective-C unterscheiden ...

Hier ist, was ich bisher für den Methodenkörper mit Hilfe vieler anderer Beiträge hier ausprobiert habe:

var test = inputText.dataUsingEncoding(NSUnicodeStringEncoding, allowLossyConversion: true)!
attrStr = NSAttributedString(
        data: test,
        options: [NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType],
        documentAttributes: nil,
        error: nil)!
return attrStr

Die Hauptprobleme hier sind, dass\n wird nicht konvertiert und die Schriftart ist sehr klein und unterschiedlich.

Next Ich habe versucht, einen Teil eines Textes manuell zu fett zu machen. Es scheint so zu funktionieren:

var newText = NSMutableAttributedString(string: inputText)
newText.addAttribute(NSFontAttributeName, value: UIFont(name: "Helvetica-Bold", size: 14.0)!, range: NSRange(location:2,length:4))

Nun habe ich versucht, nach den Attributen im Text zu suchen, sie zu löschen und das AddAttribute irgendwie so zu verwenden

// Start of bold text
var range = newText.rangeOfString("<b>")!
// End of bold text
var range2 = newText.rangeOfString("</b>")!

// replacing attributes
newText = newText.stringByReplacingCharactersInRange(range, withString: "")
newText = newText.stringByReplacingCharactersInRange(range2, withString: "")

// creating a range for bold => error "'String.Index' is not convertible to 'int'"
// how to do such a thing
var boldRange = NSMakeRange(range.startIndex, range2.endIndex -3)

// setting bold
newText.addAttribute(NSFontAttributeName, value: UIFont(name: "Helvetica-Bold", size: 14.0)!, range: boldRange)

Dieses ganze Sortiment ist momentan mein Hauptproblem, da es sich von einer einfachen Position in der Saite unterscheidet.

Diese Ausgabe ist ein gutes Beispiel für den Mangel an (oder gut versteckter) Dokumentation:

DasaddAttribute will einen NSRange, derrangeOfString scheint einen generischen Bereich gemäß einer Fehlermeldung zu liefern, die ich erhalte - aber es gibt keine Informationen darüber. Die Schaltfläche "Dokumentation durchsuchen" in Xcode aufrangeOfString() führt zu NSString. Dort nach @ suchrangeOfString()says es gibt @ zurüNSRange. Ein Klick darauf führt zur Info eines Typalias für_NSRange, das wiederum zwei NSUInteger-Eigenschaften mit dem Namen @ hlocation undlength. Wo ist die Eigenschaft startIndex und endIndex, die ich in XCode sehe? Sehr verwirrend..

Wäre toll, wenn du mir ein paar Schnipsel oder Tipps geben könntest, wo ich hier falsch liege, oder sogar den Methodenkörper, da ich immer noch hoffe, dass es nicht allzu schwierig ist, wenn du iOS und Swift gut kennst. Ich strebe Unterstützung für iOS 7.1 an, aber wenn es mit iOS 8 einfacher ist, ist es auch in Ordnung.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage